네 안녕하세요. Godhaword 입니다.
이게 이 문제로 알 수 있는 것 이랑 Key Point는 고심해서 풀고, 풀고 난 뒤에 복습의 개념으로 보시라고 뒤에 넣어놨는데 더 생각하실 분은 일단 두 문항을 보고 힌트를 얻으셔서 푸는 것도 좋아보이더라구요.
문제로 넘어가겠습니다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/sleep|benchmark/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(mysqli_error($db)) exit(mysqli_error($db));
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem");
highlight_file(__FILE__);
?>
간단한 blind sql injection 문제 같아 보입니다. 참 값을 입력하던 거짓 값을 입력하던 이번엔 Hello guest, Hello admin 값을 출력해주지 않아 저희가 평소에 하던 참 거짓 분기점으로 문제를 푸는 것은 좀 힘들어 보입니다.
하지만 if 문을 써서 union select 값을 넘기면 참 거짓값의 차이를 볼 수 있는데요
조건 문이 참이면 그냥 1 값을 보내주고, 거짓이면 select 1 union select 2 값을 보여주는 쿼리로 짰습니다.
서브쿼리가 보여주는 값이 2개 이상이 될 경우 위와 같은 에러문을 뿜어냅니다.
저는 추가적으로 거짓일 때 나오는 문구를 not in 비교 연산자를 이용하여
위와 같이 pw의 길이를 구하였습니다.
길이를 구하였다면?
substr 함수로 해당 pw의 값도 구해주시고(저때 졸려가지고 pw 길이 하나 더 쳤었네요)
나온 값을 소문자로 바꾸어줍니다.
그리고 바꿔준 값을 pw에 입력하면 문제가 solve 되는 것을 보실 수 있습니다.
추가적으로 전 sql 에선 if 문보다 case when 함수를 좋아하는데요
위 함수를 사용해서는
이렇게 코드를 짜서 길이가 32자인 것을 확인 할 수 있습니다.
https://godhaword.tistory.com/472
https://godhaword.tistory.com/473
- 이 문제로 알 수 있는 것
- 서브쿼리 : 하나의 쿼리문 안에 또 쿼리 문이 있는 것
- 서브쿼리를 사용할 땐 해당 서브쿼리를 괄호처리 해주어야 합니다.
- 서브쿼리에선 order by를 쓰지 못합니다. - Key Point
if(조건문, 참 일때 행동, 거짓 일때 행동)
case when 조건문 then 참 일때 행동 else 거짓 일 때 행동 end
이 문제는 문제로 봐서 이렇게 풀었던거지, 실제로는 그냥 지나칠 수도 있었을 만한 깊이의 문제라고 생각되네요
'web_security > Lord Of SQL' 카테고리의 다른 글
[LOS : Lord Of SQL Injection] 22번 Dark_eyes 문제 풀이 (0) | 2022.06.24 |
---|---|
[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 |