
[LOS] Level2: cobolt
두비니
·2019. 12. 31. 04:35
Lord Of SQLInjection: lv.2 cobolt
cobolt입니다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("cobolt");
elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>";
highlight_file(__FILE__);
?>
id와 pw에 prob, _ , . , ( , ) 이 포함되면 No Hack ~_~이 출력되며,
이 문제를 해결하기 위한 조건은 id가 admin이여야 합니다.
gremlin문제와 같은 방법으로, 싱글쿼리로 변수를 임의로 닫아준 후 값들을 넣어주면 되겠죠.
다 쓰고 %23으로 뒤는 모두 주석처리하는것도 잊지 맙시다.
두가지 정도 풀이가 있을 것 같네요.
1. id SQLInjection
문제가 검사하는게 오직 id가 admin인지만 검사하기때문에 pw부분은 필요없다고 생각해도 상관없다!
따라서 그냥 id에 admin'%23을 넣으면 풀린다~
2. pw SQLInjection
일단 id는 admin으로 맞춰주고, pw에 ') = 0%23을 넣어주면 query가 pw=md5('') = 0 이 되는데, (이 뒤는 주석처리)
md5 function에 null값을 넣어주었으므로 당연히 md5('')의 결과값은 0이다.
따라서 pw = 0=0 이 되므로 그냥 참인 구문이 되어버린다.
참고로 구글에 md5함수 돌려서 그에 맞는 값을 넣어도됨!
ex. pw=1') = c4ca4238a0b923820dcc509a6f75849b%23 도 된다는소리ㅇㅇ
위에 방법이랑 같은 원리입니다! 다들 id를 이용해 풀었던데 pw를 이용해서 푸는게 문제의도에 더 맞다고 생각합니다.
'War Games > Lord of SQLInjection' 카테고리의 다른 글
[LOS] Level6: orge (0) | 2020.01.04 |
---|---|
[LOS] Level5: wolfman (0) | 2020.01.03 |
[LOS] Level4: orc (0) | 2020.01.01 |
[LOS] Level3: goblin (0) | 2019.12.31 |
[LOS] Level1: gremlin (0) | 2019.12.30 |