네 안녕하세요. Godhaword 입니다.
원래 쭉 끝까지 쓰려했는데.. 피곤해서 자버렸네요. 그래도 남은 글 최대한 꾸준하게 예약글 걸어두겠습니다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/regex|like/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_xavis where id='admin' 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_xavis where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("xavis");
highlight_file(__FILE__);
?>
이번 문제 스포하자면 왜 이 정도 위치에 있는지 모르겠습니다.
그렇기에 이번 문제는 flag를 먼저 보여드리고 제가 왜 이런 방식을 썼는 지 설명하는 두괄식 느낌으로 적어보도록 하겠습니다.
일단 보시면 엥 굳이 이걸 필터링 하다고? 싶을 수준에 평소에 잘 안쓰는 함수들이 hehe 필터링이 되어 있습니다.
그렇기에 ' or 1=1# 같은 평소에 잘 막히던 pw는 이번에 잘 뚫리는 모습을 보여줍니다. 그래서 이를 기반으로 코드를 짜본다면
이런 식으로 값을 찾을 수 있고
여기서 나온 0000C6B00000C6550000AD73 값을 평소에 해주던 것 같이
소문자로 바꾸어줍니다.
그리고 입력해주면? 안됩니다.
그래서 다시 HXD를 켜주고 해당 hex 값을 다 입력한 후
decode 된 값을 입력해도 solve 가 안됩니다.
값이 24개가 나오고, hex 한 글자당 8개를 잡아먹으니 손수 풀어봅시다.
? 팬치신가요
아무튼 위에서 얻은 pw를 문제에 입력해보면
문제를 넘어갈 수 있습니다.
이 뒤로는 제가 왜 이렇게 풀었나에 대해서 알려드리겠습니다.(풀이 방법이 개인차를 탈 것 같아서..)
1. 그냥 substr로 풀기
평소와 같은 쿼리문을 쓰게된다면 length는 12개 인 것을 확인 할 수 있습니다.
하지만 위와같이 각 단어를 못찾고 substr을 넘겨버리기에 그냥 ascii로는 안풀린다 생각했습니다.
그래서 bin값으로도 해보려했는데
2. Binary
총 16글자의 bin 값을 얻을 수 있었습니다.
하지만 해당 값을 어떻게 복호화 해보아도 flag와 관련된 정보는 안나오기에 binary 방법도 넘어갔습니다.
3. 추가 Solve 방법
'or (select @gh:=pw where id='admin') union select @gh#
이런식으로 쿼리를 날렸는데요.
평소의 접근법 과는 많이 다른 접근법 입니다.
일단 select @value:="test"는 value 라는 지역변수에 test라는 값을 넣는다는 뜻입니다.
위 코드로 해석하자면 gh 라는 변수에 id 가 'admin' 인 계정의 pw를 저장하는 것인데요. 그 후에 union select로 admin 계정의 pw가 저장되어 있는 gh 변수를 출력하게 도와줍니다.
솔직히 이게 더 풀기 쉬웠겠네요
- 이 문제로 알 수 있는 것
- blind sql 로 떨어진 값이 flag로 제출이 안되더라도 조금씩 변형을 해가면서 내보자
- table view 가 아닌 곳에서도 union select를 사용 할 수 있다.
- password 가 영어가 아닌 한글로만 바뀌어도 문제를 푸는 입장에서 꽤 어려울 수도 있다 - Key Point
select @value:="text";
는 value라는 지역변수에 text라는 값을 입력해주는 쿼리이다.
hex 값으로 뽑은 값이 8의 배수라면 8자리로 끊어서 디코딩하여 디코딩 한 값도 한 번 입력해보자
'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] 18번 Nightmare 문제 풀이 (0) | 2022.06.15 |
[LOS : Lord Of SQL Injection] 17번 zombie_assassin 문제 풀이 (0) | 2022.06.12 |
[LOS : Lord Of SQL Injection] 16번 Succubus 문제 풀이 (0) | 2022.06.09 |