17.Succubus 풀이.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/\', $_GET[id])) exit("HeHe");
if(preg_match('/\', $_GET[pw])) exit("HeHe");
$query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
음... 그 전 문제인 zombie_assassin과 상당히 유사한 문제이고, 차이점은 ereg이 아니라 preg_match로 필터링 하고 있다.
[']가 차단되어서 string injection을 할 수 없을 거 같다.
다행인지 아닌지 \는 차단되어 있지 않다.
\를 이용하여 [']를 escape를 시킬 수 있다는 것이다.
id='\' and pw=' ' 즉....id의 여는 쿼터가 pw의 여는 쿼터와 연결되어 id에는 and pw=이 들어간다.
이것도 zombie_assassin처럼 2가지 판단으로 문제 풀이 가능.
1. id=' and pw=' or true로 참으로 만들고, 뒤의 [']는 주석 처리하면 된다.
?id=\&pw=%20or%20true%23
2.\ 표시를 사용할 수 있으니 sql 구문 안에다가 따옴표를 넣고 싶을 경우. \' 사용.
\'을 이용하면 [']을 하나 무시할 수 있다.
?id=\&pw=||1%23 ==> 쿼리 안으로 들어가고 id 안에 \' and pw = 까지 들어간다. or문으로 참값을 보낸다.
일단 \를 이용해서 [']를 문자열로 취급해줄 수 있다면, id='\' and pw='||1#' 쿼리가 가능하고,
중요한 건 문자열의 범위를 알아채는 것.
'\' and pw= <= 문자열 1 <= 정수 부분.
즉 where 부분은 0 or 1은 참으로 처리되고, id 결과는 무조건 참이라고 나온다.
'# Related site issues > LOS' 카테고리의 다른 글
19.Xavis. (0) | 2018.05.09 |
---|---|
18.Nightmare. (0) | 2018.05.08 |
16.zombie_assassin. (0) | 2018.05.08 |
15.Assassin. (0) | 2018.05.08 |
14.Giant. (0) | 2018.05.08 |