Webhacking 8번 문제입니다.
소스코드를 제공해주고 있으니 먼저 소스코드를 보겠습니다.
PHP코드로 이루어져 있으며 query등이 보이는 것으로 SQL 인젝션이 필요한 문제라고 생각하였습니다.
먼저 코드를 읽어보면 $agent에 HTTP_USER_AGENT를 공백제거후 대입하고
$ip에는 REMOTE_ADDR 접속자의 IP를 받아 대입한다고 합니다.
그다음으로 넘어가서 $result 을 보면 addslashes 함수로 처리한 HTTP_USER_AGENT를 확인해
$ck에 대입시키는데
값이 존재할때는 admin인지를 if구문으로 판단하고 없다면 'agnet', 'ip', 'guest'로 추가한다고 되어 있습니다.
Write up
코드에서 우리는 admin으로 로그인을 해야합니다.
하지만 현재 db에는 admin이 없는 상태로 예상됩니다.
왜나면 첫 접속시 아래와 같은 상태로 되어있는데
done!를 출력해주는 경우는 아래 코드일때 입니다.
$count_ck[0]/70 인데 현재 0으로 되어 있기에 어떠한 값도 DB에 없다는 것을 알려주고 있는 것입니다.
그러면 admin을 찾는 것이 아닌 if(!$ck) 부분을 이용해서 admin을 DB에 저장시킨다음
다시 조회를 하는 것으로 admin으로 로그인 해야 한다는 것을 알 수 있습니다.
일단 $agent를 대입할 수 있는 HTTP_USER_AGENT를 조작하기위해 버프스위트를 사용했습니다.
버프스위트로 패킷을 캡쳐해보면 User-Agent가 있기에 이부분을 조작하면 $agent의 조작이 가능합니다.
여기서 작성자는 삽질을 조금 했습니다.
처음에는
insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest') 코드에서 {$agent} 만 우리가 조작이 가능하기에
$agent를 조작해 values('my1','1','admin') values('{$agent}','{ip}', 'guest')") 형태로 삽입하려고 했습니다.
왜냐면 chall8(agent,ip,id)로 3개의 값을 받고 있기에 values도 3개의 값을 전달해주는 형태이기에
admin을 입력하기 위해 values를 두개 쓰는게 가능한가 하면서 삽질을 했습니다.
그러다 지인의 조언으로 주석처리를 하라고 도움을 받았습니다.
즉, insert into chall8(agent,ip,id) values('my1','내 ip','admin')#','{$ip}','guest') 가 되면 정상쿼리로 처리가 된다구요
주석처리를 SQL 인젝션을 하면서 항상써왔는데 떠올리지를 못한 삽질이였습니다.
해서 위 내용을 토대로 my1, 내 ip, admin을 삽입하면
my1, 내ip, admin이 저장되면서 1이 추가되었습니다.
이제 admin을 조회하면 되기에 아까 입력한 my1을 $agent에 넣어 조회를 해보겠습니다.
hi admin이 되면서 문제가 해결되었습니다.
'Wargame(Web) > Webhacking.kr Writeup' 카테고리의 다른 글
Webhacking Writeup baby 문제 (0) | 2022.09.26 |
---|---|
Webhacking Writeup 22번 문제 (1) | 2022.09.26 |
Webhacking Writeup CHILD 문제 (0) | 2022.09.04 |
Webhacking Writeup 50번 문제 (0) | 2022.09.01 |
Webhacking Writeup 45번 문제 (0) | 2022.08.31 |