[Webhacking.kr] old-08 (SQL injection 활용문제)

728x90
반응형

1. 서론

본 포스팅 시리즈는 webhacking.kr의 문제 풀이를 하면서 정리한 자료이다.
필자가 풀이한 방법들이기 때문에 완벽하지 않을 수도 있다는 점을 참고 바란다. (지적과 조언은 언제나 환영이다)

이번 문제는 old-8, SQL injection 활용이 필요한 문제이다.

2. 본론

이번 문제에 처음 접속하면 이러한 화면을 볼 수 있다. "done! (0/70)"이라는 문구를 확인할 수 있는데, 아직까지는 이것의 의미는 알 수가 없다.

근데 조금 이상한 점은 새로고침을 했더니 이러한 페이지로 바뀌었다는 것이다. 다시 여러번 새로고침을 해봐도 이 페이지가 나타나는걸로 봐선 아마 내 접속 정보를 따로 저장해두고 있는듯하다.

이건 이번 문제의 소스코드이다. DB에 접속하고 쿼리를 요청하는 부분이 있는 걸로 봐선 이번 문제는 SQL injection을 이용해야할 듯하다.

소스코드 상단부터 살펴보면,
  우선 $agent 라는 변수에 "HTTP_USER_AGENT" 환경변수값을 대입하고 있다. "HTTP_USER_AGENT"란, HTTP request 패킷 header에 있는 요청자의 브라우저 정보를 나타내는 항목이다. 
  그리고 $ip 라는 변수에 요청자의 ip정보를 대입하고, 그 바로 아래에 정규식 필터로 $agent 의 값에 'from'이라는 문자가 있는지 검사하여 참이라면 Access Denied! 를 출력하는 모습을 볼 수 있다. $agent 의 값을 정규식으로 검사하는 걸보면 아마 "HTTP_USER_AGENT" 의 값을 이용해 SQL injection을 수행할 수 있을 것으로 추정된다.

이번 문제의 해결 조건은 $ch[0](chall8 테이블에서 가져온 첫번째 row의 id) 의 값이 'admin'이어야 한다고 한다.

$ch[0]가 'admin'이 되려면 위 이미지에 있는 쿼리에서 우리가 'HTTP_USER_AGENT'의 값을 변경해서 id의 값이 우리가 원하는 값이 나오도록 유도 또는 조작해야한다. 그렇다면 생각나는 방법은 우선 위 쿼리의 결과값이 empty가 되도록 하고 union으로 'admin'이라는 문자열을 리턴하는 select 문을 결합하는 방법이 있을듯하다. 근데 문제는 union으로 'admin'을 넣으려면 따옴표를 넣어야하는데 addslaches() 함수때문에 따옴표가 이스케이프 처리되버린다. 이래서 이 방법은 사용할 수 없을 듯하다.

그럼 다른 공격지점을 찾아야하는데, 가장 유력한 곳은 여기다. 위에서 $agent 에 값을 대입할 때 addslaches를 거치치 않기 때문에 더욱 작업하기가 쉬울 듯하다.
여기서는 insert문으로 현재 접속자의 agent 값을 키 값으로 ip와 id값을 저장한다. 그렇다면 여기서 SQL injection으로 id의 값을 우리가 원하는 'admin'으로 넣어주면 이후 agent 값을 우리가 세팅한 키 값으로 접속할시에 문제를 해결하게 될 것이다.

그런데 HTTP request heade 안에 있는 user agent 값을 조작하려면 패킷 인터셉터가 필요하기 때문에 대부분 많이 사용하는 Burp Suite을 사용할 것이다.
설치를 하지 않았다면 아래 링크로 들어가서 다운받길 바란다. 사용방법은 추후 다른 포스트로 올릴 예정이지만 일단 다른분들의 블로그들을 참고하여 세팅하길 바란다.
https://portswigger.net/burp/communitydownload

 

Download Burp Suite Community Edition - PortSwigger

Burp Suite Community Edition is PortSwigger's essential manual toolkit for learning about web security testing. Free download.

portswigger.net

intercept한 패킷의 user agent 원본 값
SQL injection을 위한 user agent 변조값

아무튼 세팅이 다 되었고 문제의 페이지를 새로고침하면 위와같이 패킷이 intercept될텐데, 이때 User-Agent 값에 쿼리를 넣어주면 된다. 이렇게 하면 'hackedbybetaman'이라는 키값으로 id가 'admin'이라는 row가 테이블에 저장될 것이다.

done의 숫자가 2 증가한걸로 봐선 성공적으로 쿼리가 실행된 듯하다.

이제 다시 패킷을 intercept한 후에 User-Agent값을 아까 삽입한 row의 키값을 넣어주면 id가 'admin'인 row가 가져와지면서 이번 문제가 해결된다.

728x90
반응형