write-up/web

[webhacking.kr] Challenge 8

여니두 2019. 1. 4.


USER-AGENT에 관한 문제인가 보다.



index.phps로 가보자!


<html>
<head>
<title>Challenge 8</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<br><br>
<center>USER-AGENT

<?

$agent
=getenv("HTTP_USER_AGENT");
$ip=$_SERVER[REMOTE_ADDR];

$agent=trim($agent);

$agent=str_replace(".","_",$agent);
$agent=str_replace("/","_",$agent);

$pat="/\/|\*|union|char|ascii|select|out|infor|schema|columns|sub|-|\+|\||!|update|del|drop|from|where|order|by|asc|desc|lv|board|\([0-9]|sys|pass|\.|like|and|\'\'|sub/";

$agent=strtolower($agent);

if(
preg_match($pat,$agent)) exit("Access Denied!");

$_SERVER[HTTP_USER_AGENT]=str_replace("'","",$_SERVER[HTTP_USER_AGENT]);
$_SERVER[HTTP_USER_AGENT]=str_replace("\"","",$_SERVER[HTTP_USER_AGENT]);

$count_ck=@mysql_fetch_array(mysql_query("select count(id) from lv0"));
if(
$count_ck[0]>=70) { @mysql_query("delete from lv0"); }


$q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'");

$ck=@mysql_fetch_array($q);

if(
$ck)

echo(
"hi <b>$ck[0]</b><p>");
if(
$ck[0]=="admin")

{
@
solve();
@
mysql_query("delete from lv0");
}


}

if(!
$ck)
{
$q=@mysql_query("insert into lv0(agent,ip,id) values('$agent','$ip','guest')") or die("query error");
echo(
"<br><br>done!  ($count_ck[0]/70)");
}


?>

<!--

index.phps

-->

</body>

</html>




.

.

.


소스코드를 살펴 보면


* http_user_agent 환경변수를 얻어 agent에 저장


* getenv(): 인자로 오는 변수에 따라, 해당되는 환경변수값을 알려주는 역할


* REMOTE_ADDR: 웹사이트를 접속한 컴퓨터의 IP Address


* HTTP_USER_AGENT: 웹사이트를 접속한 컴퓨터의 웹브라우저 정보


* $_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경  ex ) Mozilla4.0(compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705


* $_SERVER['REMOTE_ADDR'] = 사이트 접속한 사용자 IP  ex )  xxx.xxx.xxx.xxx


* preg_match(pattern,subject) : pattern에 주어진 정규표현식을 subject에서 찾는다.


* mysql_fetch_array(): db에서 가져온 하나의 열을 배열 형태로 저장하는 함수.


* mysql_query(): mysql에 쿼리를 보내주는 함수.




여기에서 중요한 부분은 



이 부분인 것 같다.


처음에는 ck 값이 없을 것이다. 아직 insert into ~ 한 것이 없기 때문이다.


"insert into lv0(agent,ip,id) values('$agent','$ip','guest')"


insert 쿼리문은 values에 comma를 넣으면 여러 개의 데이터를 동시에 집어넣을 수 있다.


이 부분에서 $ip와 'guest'는 바꿀 수 없기 때문에 agent를 공격해야 할 것이다.


agent에는 HTTP_USER_AGENT 값이 들어가기 때문에 HTTP_USER_AGENT에 값을 넣어주자!


 

페이로드


내이름넣음', '127.0.0.1', 'admin'), ('hack



프록시 툴을 이용하여 패킷을 저 웹 서버에 보내주자


Burp Suite란?

: 웹 프록시 서버를 사용하여 클라이언트, 서버의 응답 및 요청 패킷을 확인하고 조작이 가능한 툴.


Intercept is off를 클릭해서 Intercept is on으로 바꿔주면 웹 사이트를 요청할 때마다 패킷 메세지가 하단에 도착하게 된다.


Forward를 이용해 패킷을 웹 서버로 전송시킬 수 있고 Drop으로 누락시킬 수도 있다. 프록시를 사용하고 싶지 않다면 


다시 Intercept is on을 눌러주면 된다.


proxy 이외에도 브루트 포스 공격할 때 사용되는 Intruder, 응답을 분석, 비교할 때 사용하는 Repeater, 데이터를 복호화할 수 있는 Decoder 등


다양한 기능을 제공하고 있다.





User-Agent에 값을 넣자



값을 넣어 Forward로 패킷을 보낸다!


그럼 이제 $ck가 생겼으니, 패킷을 한번 더 전송하여 if문으로 ck가 admin인지 확인하게 하자.







클리어






'write-up > web' 카테고리의 다른 글

[webhacking.kr] Challenge 18  (0) 2019.01.05
[webhacking.kr] Challenge 16  (0) 2019.01.05
[webhacking.kr] Challenge 12  (0) 2019.01.04
[webhacking.kr] Challenge 14  (2) 2019.01.02
[webhacking.kr] Challenge 10  (0) 2018.12.30

댓글