[webhacking.kr] Challenge 8
USER-AGENT에 관한 문제인가 보다.
index.phps로 가보자!
<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 |
댓글