네 안녕하세요. Godhaword 입니다.
바로 문제로 보시죠
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/col|if|case|when|sleep|benchmark/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(mysqli_error($db)) exit();
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("dark_eyes");
highlight_file(__FILE__);
?>
이 문제도 21번 문제처럼 서브쿼리를 사용하면 될 것 같네요.
하지만 필터링에 case, when, if 문이 모두 들어가 있어 같은 함수를 다시 사용하는 건 좀 힘들어보입니다.
이렇게 간단한 서브쿼리를 입력해 참 거짓 값을 판단해보겠습니다.
참 일 시에는 뭔 값이라도 뜨고, 거짓일 경우 error 값을 보여주는 것을 알 수 있습니다.
일단 이 문제 해설에 앞서, select 1 unoin select 1=1 과 select 1 unoin select 1=2 가 왜 이런 차이를 보여주는지 이해를 하시면 앞으로의 문제도 풀기 쉬우실 것 같습니다.
select 1 union select 1
select 1 union select 1=1
위에 값이 전 문제에서 풀었던 쿼리이고 밑에 값이 이번 문제에서 사용되는 쿼리입니다.
서브쿼리로 나온 값이 두개 이상일 경우 에러를 내는 것을 저희는 알 수 있었습니다.
기본적으로 select 1을 통하여 1 이라는 값이 나오게 되고, union select 를 통하여 또 1 값이 나오게되면 총 나오는 값은 1 단 하나로 정해질 수 있습니다.
하지만
select 1 union select 2
select 1 union select 1=2
와 같은 값을 입력한다면 위의 쿼리는 1과 2, 아래의 쿼리는 1과 0을 return 하게 되어 에러를 만들게 되는 것입니다.
간단하지만 이 개념을 이해 안하고 그냥 바로 다음 문제로 넘어가거나 해당 문제를 풀게 되면 다음에 같은 유형으로 문제를 봤을 때, 또 시간만 주구장창 쓰는 모습을 보실 수 있을 것 입니다.
다시 문제로 돌아와서
서브쿼리 안에 조건문을 통하여 길이를 구했더니 8글자가 나옵니다.
코드를 짰는데 값이 이상하길래 코드를 다시 확인해본 결과, j 변수 쪽에 싱글쿼터로 안 감싸져있더라구요.
그래서 싱글쿼터를 추가하여
위와 같이 pw 값을 찾아준 후
python 기능을 통하여 소문자로 바꾸어주고
해당 pw 값을 get 형식으로 보내준다면
DARK_EYES 문제도 solve가 된 것을 볼 수 있습니다.
- 이 문제로 알 수 있는 점
- 서브쿼리는 하나의 값만 return 할 수 있다.
- 참 값은 1, 거짓 값은 0이다 - Key Point
select 1 union select 1=1
select 1 union select 1
'web_security > Lord Of SQL' 카테고리의 다른 글
[LOS : Lord Of SQL Injection] 21번 Iron_golem 문제 풀이 (2) | 2022.06.22 |
---|---|
[LOS : Lord Of SQL Injection] 20번 Dragon 문제 풀이 (0) | 2022.06.19 |
[LOS : Lord Of SQL Injection] 19번 Xavis 문제 풀이 (0) | 2022.06.18 |
[LOS : Lord Of SQL Injection] 18번 Nightmare 문제 풀이 (0) | 2022.06.15 |
[LOS : Lord Of SQL Injection] 17번 zombie_assassin 문제 풀이 (0) | 2022.06.12 |