wargame/webhacking.kr

webhacking.kr 8번 풀이

LimeLee 2018. 8. 8. 19:20

webhacking.kr 8번 풀이




[HINT]


1. SQL Injection in INSERT query

2. 환경 변수





문제에서는 클라이언트의 HTTP_USER_AGENT와 REMOTE_ADDR를 가져와 각각 $agent,$ip에 저장한다.

$agent 변수에서 문자열 앞 뒤 공백 제거, 일부 문자열 치환 및 필터링, 소문자 치환 과정을 거친다.


이후 $_SERVER를 통해 HTTP_USER_AGENT를 가져와서 싱글쿼터(')\를 필터링한다.

싱글 쿼터(')\를 필터링한 HTTP_USER_AGENT의 값으로 쿼리를 불러오고 쿼리의 반환 값으로 "admin"이 있다면 문제를 해결할 수 있다.

"admin" 값이 없다면 agent, ip, id 테이블 안에 각각 변수 $agent,$ip 와 문자열 'guest'라는 데이터를 삽입한다.



각각의 변수가 어떤 값을 가지고 있는지 문제에서는 보여주지 않기 때문에, 어떤 값이 들어가는지 가시적으로 보기 위해 본인의 웹 사이트를 통해 실험해보도록 한다. 

변수 $agent$ipINSERT 쿼리에 들어가는 값이고, $_SERVER[HTTP_USER_AGENT]SELECT 쿼리에 들어간다. 

$agent의 필터링, 치환 과정은 넣지 않았다.



별다른 변조를 하지 않고 보면 다음과 같은 값이 출력된다.

DB에는 admin이라는 값이 존재하지 않기 때문에 직접 만들어주어야한다. 

INSERT 쿼리를 통해 만들어줄 수 있고, UNION injection을 하여 만들어 줄 수 있다.


그러기 위해선 HTTP_USER_AGENT 값을 변조하던지 IP 값을 변조할 필요가 있다.

IP는 VPN을 통해 자신의 IP외 다른 IP로 속일 수 있고, HTTP_USER_AGENT의 경우 HTTP Request Header에서 User-Agent 값을 수정하여 변조시킬 수 있다. 그 중, VPN을 통해 IP를 변경하는 방법은 IP가 변조가 될 뿐, 원하는 쿼리값을 삽입하는 방법은 아니므로 User-Agent의 값을 변조하는 방법을 이용한다.



User-Agent의 값을 'test'로 변조 시켰을 때, $agent$_SERVER[HTTP_USER_AGENT]의 값이 'test'로 변조된 것을 확인 할 수 있다.

이를 통해 SELECT 쿼리와 INSERT 쿼리에 원하는 값을 넣을 수 있다. 



하지만 User-Agent 값을 "test '1=1-- -"을 하게 되면, $_SERVER[HTTP_USER_AGENT]값에는 싱글 쿼터를 필터링하는 코드가 있어 원하는 쿼리를 삽입 할수 없다. $agent의 경우에는 싱글 쿼터를 필터링하지 않아 INSERT 쿼리에 injection을 하는 방향으로 진행한다.



user_agent는 INSERT 쿼리의 첫 번째 필드에 들어간다. 그래서 이후 두 번째, 세 번째 필드 값을 맞춰주지 않으면 INSERT 쿼리에서 에러가 발생하게 된다. 그러므로 agent 값','ip 값','admin') 와 같이 필드 값을 맞춰준다. 

그리고 ,('DUMMY값 을 추가적으로 넣어주어 이후 들어가는 agent 값,'$ip','guest') 값도 문법에 맞춰주거나 '#' 을 통해 $agent 뒤의 쿼리를 주석처리 해준다. ( '--' 주석의 경우 필터링으로 인해 Access Denied를 출력한다.)


User-Agent를 변조시킨 Request Header에 대한 Responce에 Done!이라는 문자가 제대로 출력되었다면 User-agent를 admin 값과 함께 삽입한 User-Agent의 값으로 변조시켜 요청하게 되면 문제를 해결할 수 있다.


참고로 $agent에 "본인의 User-Agent','$ip','admin')#"을 하게 되면 요청할 때 User-Agent를 변조시키지 않아도 문제가 해결될거라 추측할 수도 있는데 $agent 변수는 대문자를 소문자로, 그리고 ".""/""_" 로 치환하는 코드가 있다.( but, Mysql은 설정에 따라 대소문자를 구분하지 않을 수 있다. )

하지만 SELECT 쿼리에 들어가는 $_SERVER[HTTP_USER_AGENT]에는 $agent와 같은 치환 코드가 존재하지 않는다.

결국 테이블에 값을 INSERT 시킬 때, 자신의 User-Agent와 같은 값을 삽입 시킬수 없다.



'wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 18번 풀이  (0) 2018.08.13
webhacking.kr 34번 풀이  (1) 2018.08.10
webhacking.kr 17번 풀이  (1) 2018.08.08
webhacking.kr 4번 풀이  (0) 2018.08.08
webhacking.kr 14번 풀이  (1) 2015.08.14