Lord Of SQL injection, 문제 12번 다크나이트입니다.
배율을 좀 확대해서 캡처했기 때문에 사진이 좀 큽니다.
가장 중요한 필터링 부분을 보시겠습니다.
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");
pw에서 single quote를 필터링하고
no에서 single quote, substr, ascii, 등호기호를 필터링하고 있습니다.
이번에는 substring이 먹히지 않겠습니다.
pw에 작업을 하려했더니 no가 있군요. 그러므로 no를 사용해서 작업을 합니다.
먼저 단순하게 참을 만들어보겠습니다.
pw=1234&no=1 or id LIKE "admin"
single quote가 막혔지만 double quote는 쓸 수 있습니다.
그리고 pw 내에서는 이런 double quote를 못쓰는데 no에서는 쓸 수 있습니다.
그 이유는 no에서 값을 처리할 때는 따옴표가 없는 숫자형식으로 처리를 하게됩니다.
반대로 pw는 " 또한 하나의 문자열로 인식해서 pw=1234 or id LIKE "admin" 과 같은 방식으로는 도저히 먹히지 않습니다.
pw=1234&no=1 or id LIKE "admin" %26%26 LENGTH(`pw`) LIKE "8"
길이를 검사해주고 비밀번호를 알아내기만 하면되는데 substr을 사용못한다고 앞서 말씀드렸습니다.
그러면 무슨 방법이 있을까하다가 left와 right를 사용할 수 있다는 걸 알게되었습니다.
left(대상, 자리수) 라고 보시면됩니다.
left(pw, 1) 이라면 pw의 1번째 자리까지 잘라내서 출력하는 것인데,
여기서 출력을 한다고 쿼리가 정상적으로 나오지 않으므로 (지금은 Blind-injection을 수행중 이므로)
left(pw,1)의 결과가 a와 동일한가? 를 질문해서 Hello admin이 출력되면 체크하는 방식을 사용해야합니다.
그렇게 만들게된 파이썬 스크립트를 아래 첨부합니다.
'워게임 > LOS' 카테고리의 다른 글
[워게임 LOS] 문제 14번, 자이언트(Giant) (0) | 2016.07.27 |
---|---|
[워게임 LOS] 문제 13번, 버그베어(Bugbear) (0) | 2016.07.27 |
[워게임 LOS] 문제 11번, 골렘(Golem) (0) | 2016.07.26 |
[워게임 LOS] 문제 10번, 스켈레톤(Skeleton) (0) | 2016.07.26 |
[워게임 LOS] 문제 9번, 뱀파이어(Vampire) (0) | 2016.07.12 |