뉴비에욤
Webhacking.kr 8번 본문
$agent 변수에 "getenv" 함수를 이용하여 "HTTP_UESR_AGENT" 값을 저장한다.
$ip 변수에 클라이언트의 공인 IP 값을 저장한다.
$agent 변수에서 공백을 제거(trim) 한다.
$agent 변수에서 '.', '/' 문자가 발견되면 '_' 문자로 치환한다.
$pat 변수에 필터링 할 여러 문자열들을 저장한다.
$agent 변수 값과 $pat 변수값을 비교하여 일치하면(필터링에 걸리면)가 오류가 발생한다.
HTTP_USER_AGENT 값에 대하여 특정 문자를 치환한다.
$count_ck 변수에 "SELECT" 쿼리 결과가 저장된다.
쿼리 결과(id 컬럼 개수)값이 70개 이상이면 "lv0" 테이블의 모든 데이터를 삭제한다.
$q 변수에 쿼리를 저장하는데, 쿼리에서 $HTTP_USER_AGENT 변수 값이 사용된다.
$ck 변수에 $q 쿼리 변수를 실행한 결과를 저장한다.
$ck 변수 값이 존재하면 "hi $id" 문자열을 출력하고, 해당 $id 값이 "admin" 이면 문제가 클리어 된다.
만약 $ck 변수 값이 존재하지 않으면 "INSERT" 쿼리를 날려준다.
* 처음 문제를 풀려고 할 때에는 당연히 $ck 변수(쿼리 실행 결과) 값이 없기 때문에 "INSERT" 문이
실행된다.
그런데 $ip 변수는 우리가 변조 할 수 없기 때문에 결국 인젝션 포인트는 $agent 변수가 된다.
그리고 id 값이 "admin" 일 때만 클리어 되는데 이미 위 쿼리에서는 "guest" 문자열이 고정으로
박혀있다.
따라서 $agent 변수에서 테이블의 agent, ip, id 값을 모두 세팅하고 주석을 입력하여 뒷 부분을
무시해야 한다.
우선 기본적으로 패킷을 보내면 "User-Agent" 값은 "Mozilla/5.0 (Windows NT 6.1; WOW64) ~~" 가
세팅된다.
"INESRT" 쿼리에서 사용되는 인젝션 포인트 ($agent 변수)를 공격하기 위해 "User-Agent" 값을
위와 같이 변조한다.
페이로드
- bob', '58.xxx.xxx.xxx', 'admin') #
실행되는 쿼리
- INSERT INTO lv0(agent,ip,id) VALUES ('Mozilla/5.0 ~~~', '58.xxx.xxx.xxx', 'guest')
- agent 값 변조
- INSERT INTO lv0(agent,ip,id) VALUES ('bob', '58.xxx.xxx.xxx', 'admin') #',
'58.xxx.xxx.xxx', 'guest')
- 주석 '#' 때문에 뒷 부분 무시
- INSERT INTO lv0(agent,ip,id) VALUES ('bob', '58.xxx.xxx.xxx', 'admin')
위와 같이 날리면 "bob" 라는 Uesr-Agent 데이터에 해당되는 id 값은 "admin"이 될것이다.
문제 클리어를 위해 User-Agent 값을 "bob"로 변조한다.
INSERT 쿼리가 실행되었기 때문에(결과 존재) SELECT 쿼리가 실행되어 "admin" 문자열을
가져올 것이다.
'Webhacking.kr' 카테고리의 다른 글
Webhacking.kr 10번 (0) | 2015.08.15 |
---|---|
Webhacking.kr 9번 (0) | 2015.08.15 |
Webhacking.kr 7번 (0) | 2015.08.15 |
Webhacking.kr 6번 (0) | 2015.08.15 |
Webhacking.kr 5번 (0) | 2015.08.15 |