<?php
$agent=trim(getenv("HTTP_USER_AGENT"));
$ip=$_SERVER['REMOTE_ADDR'];
if(preg_match("/from/i",$agent)){
echo("<br>Access Denied!<br><br>");
echo(htmlspecialchars($agent));
exit();
}
$db = dbconnect();
$count_ck = mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8"));
if($count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); }
$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");
$ck = mysqli_fetch_array($result);
if($ck){
echo "hi <b>".htmlentities($ck[0])."</b><p>";
if($ck[0]=="admin"){
mysqli_query($db,"delete from chall8");
solve(8);
}
}
if(!$ck){
$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
echo("<br><br>done! ({$count_ck[0]}/70)");
}
?>
먼저, 생소한 함수가 많아서 정리부터!
trim(): 문자열 앞 뒤의 여백 제거
getenv(): 환경변수 얻기
htmlspecialchars(): 각각의 HTML 특수 문자들을 일반 문자열로 인식할 수 있도록 변환
ex) & -> & "(더블쿼터) -> ", '(싱글쿼터) -> ', < -> <
addslashes(): DB에서 오류로 들어갈 수 있는 싱글쿼터를 예외처리 함
ex) I'm -> I\'m
htmlentities(): 주어진 모든 문자를 엔티티로 반환한다
ex) <b>, </b> 등 그대로 출력
$ck[0] 변수가 "admin"이 될 경우 문제가 풀릴 것으로 예상된다
그런데 마지막 if문을 보면, 변수 $ck[0]가 없을 경우 쿼리를 insert한다고 나와있다!
(HTTP_USER_AGENT에 들어간 변수값이 정상적인 쿼리가 아니라서 $ck가 존재할 수 없다고 한다)
자세히 보면 아래와 같다
$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
위의 코드에서 SQL 인젝션을 활용하여, ID가 admin인 계정으로 사이트에 접속해보자
프록시 툴인 burp suite를 사용해서 잡아봤다
User-Agent 부분이 Chrome 브라우저의 정보로 되어 있다
이제 여기서, ip, id는 수정을 못하지만 내가 수정할 수 있는 agent를 통해 쿼리를 변조해보자
위의 코드인
$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error"); 에서,
해당 $agent를 말하는 것이다
그럼 이 대신에,
agent -> agent1', 'ip1', 'id1'), ('agent2의 형태로 변조해보면
values('{$agent1}', 'ip1', 'id1'), ('agent2,'{$ip}','guest')")가 된다
이 때 id1를 admin!으로 맞춰야 하기 때문에
matiii', '123', 'admin'), ('agent2
로 변조해보자
그런데 forward를 아무리 눌러도 아무 일도 일어나지 않았다..
저 70을 다 채우면 되려나..
'Wargame > webhacking.kr' 카테고리의 다른 글
Challenge old 11 (300) (0) | 2020.01.22 |
---|---|
Challenge old 10 (250) (0) | 2020.01.22 |
Challenge old 7 (300) (0) | 2020.01.19 |
Challenge old 5 (300) (0) | 2020.01.19 |
[미완] Challenge old 4 (300) (0) | 2020.01.19 |