Information Security
[Lord Of Sql injection] orc 본문
[Lord Of Sql injection] orc
이 문제에는 중요한 내용이 많이 나온다.
이 문제를 풀었으면 이 다음에 나오는 많은 문제를 쉽게 풀 수 있을 것이다.
$_GET[pw] = addslashes($_GET[pw]);
이전에 했던 것처럼 참으로 만들면 가능할 것이라 생각했지만 addslashes()에 의해 싱글 쿼터가 차단된다.
pw를 string으로 받기 때문에 addslashes()를 우회할 수도 없다.
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
그리고 쿼리 실행 결과로 출력된 result의 pw와 GET 방식으로 전달받은 pw가 같아야만 문제를 통과한다.
패스워드를 직접 알아내야 한다는 것이다.
어떻게 해야 알아낼 수 있을까요?
Blind Sql Injection 공격은 참 or 거짓을 통해서 화면이 다르게 출력되는 것을 이용하여 보이지 않는 정보를 노출시키는 것이라고 했다.
$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysql_fetch_array(mysql_query($query));
if($result['id']) echo "<h2>Hello admin</h2>";
위의 쿼리는 싱글 쿼터를 차단하지 않는다.
그리고 해당 쿼리를 참으로 만들면 "Hello admin"이라는 메시지가 출력된다.
거짓으로 만들면 메시지가 출력되지 않는다.
이를 이용해서 패스워드를 알아내야 할 것 같다.
admin의 패스워드만 알아내야 하기 때문에 or를 사용해서 전자는 무시하도록 했다.
만약에 이 부분을 삽입하지 않았다면 admin말고 다른 id의 pw가 참일 때도 메시지가 출력되어 혼동될 것이다.
먼저 패스워드의 길이를 알아보기 위해서 length()를 이용했다.
length(pw)의 값이 5보다 크다고 입력했더니 Hello admin 메시지가 출력되었다.
이 문장은 참인 것이다.
length(pw)의 값이 10보다 크다고 입력했더니 Hello admin 메시지가 출력되지 않았다.
이 문장은 거짓인 것이다.
이제 length(pw)의 값이 8이라고 입력했다.
메시지가 출력되었으므로 admin의 패스워드는 8글자인 것을 알게 되었다.
이제 8글자를 모두 알아내야 한다.
substr 함수를 사용해서 pw를 1글자씩 가져오고 이를 아스키 값으로 변경해서 패스워드를 추측한다.
substr(해당문자열의, 어디서부터, 몇 개?)
substr 함수의 두번째 인자를 증가시키면서 8번째 글자까지 알아낸다.
8글자를 모두 알아냈고 이제 이 아스키 값들을 문자로 변환 시킨다.
패스워드를 입력하면 ORC 문제도 성공!
'Web Hacking > Lord Of Sql injection 풀이' 카테고리의 다른 글
[Lord Of Sql injection] darkelf (0) | 2017.12.23 |
---|---|
[Lord Of Sql injection] wolfman (0) | 2017.12.23 |
[Lord Of Sql injection] goblin (0) | 2017.12.14 |
[Lord Of Sql injection] cobolt (0) | 2017.12.14 |
[Lord Of Sql injection] gremlin (0) | 2017.12.13 |