Description

Category: Web

Source: webhacking.kr

Points: 150

Author: Jisoon Park(js00n.park)

Description:

Write-up

Mail Header Injection 문제이다.

페이지 소스를 열어보면 index.phps가 제공되는 것을 볼 수 있다.

<html>
<head>
<title>Challenge 47</title>
</head>
<body>
Mail Header injection
<pre>
<form method=post action=index.php>
<font size=2>Mail</font> : <input type=text name=email size=50 style=border:0 maxlength=50><input type=submit>
</form>

<?

if($_POST[email])
{

$pass="????";

$header="From: $_POST[email]\r\n";

mail("admin@webhacking.kr","readme","password is $pass",$header);


echo("<script>alert('Done');</script><meta http-equiv=refresh content=1>");
}
?>

</pre>

<!-- index.phps -->

</body>
</html>

입력한 이메일 주소를 발송인으로 하여 admin 계정으로 password 정보를 보내도록 되어있다.

제목에서 알려준대로 injection을 하기 위해 우선 email header의 구조를 알아보자.

검색을 통해 email header를 찾아보면 굉장히 여러가지를 넣을 수 있도록 되어있는 것 같은데, 일단 저 메일을 나에게 보내는 것이 목적이니 관련 필드를 찾아보면 To, Cc, Bcc가 있다.

To를 넣어봐야 mail 함수에서 admin@webhacking.kr으로 덮어쓸것 같으니 날아가는 패킷을 잡아 Cc로 원하는 주소를 넣어보자.

원래는 내 실제 이메일 주소를 넣어야 하지만, 대충 Cc에 뭔가 다른 주소가 들어오면 password를 알려준다.

알아낸 password를 auth 등록하면 점수를 획득할 수 있다.

'writeups > Web' 카테고리의 다른 글

WTF_CODE  (0) 2019.11.23
webhacking.kr 058  (0) 2019.11.23
webhacking.kr 039  (0) 2019.11.23
webhacking.kr 038  (0) 2019.11.23
webhacking.kr 032  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

문제를 보니 이것도 injection 문제인것 같다. 소스코드를 보면 index.phps가 있으니 보라고 한다.

감사한(?) 마음으로 열어보자.

<html>
<head>
<title>Chellenge 39</title>
</head>
<body>

<?

$pw="????";

if($_POST[id])
{
$_POST[id]=str_replace("\\","",$_POST[id]);
$_POST[id]=str_replace("'","''",$_POST[id]);
$_POST[id]=substr($_POST[id],0,15);
$q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]"));

if($q[0]=="good") @solve();

}

?>

<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
</body>
</html>

입력한 id가 DB에 있으면 good이 반환되고 문제가 풀리도록 되어있다.

일단 아무거나 넣어보면 SQL 오류가 발생한다.

코드를 자세히 보면, id를 넣는 부분에서 single quot를 열기만 하고 닫지 않는다.

텍스트 박스에 입력할 때 맨 뒤에 single quot를 추가하면 str_replace()에서 single quot를 두개로 바꾸기 때문에 여전히 오류가 나고,  를 이용해도 마찬가지로 str_replace()가 지워버리기 때문에 해결할 수가 없다.

코드를 유심히 보면 substr()함수로 15문자를 자르는데, 이걸 이용해서 불필요한 single quot를 잘라낼 수 있을 것 같다.

적당히 있을만한 id인 good이나 admin뒤에 공백을 채우고 15번째 글자를 single quot로 하여 전송하면 str_replace()를 지나면서 잠시 16 글자가 되었다가, substr()에서 다시 15글자가 되어 문제를 해결할 수 있다.

'writeups > Web' 카테고리의 다른 글

webhacking.kr 058  (0) 2019.11.23
webhacking.kr 047  (0) 2019.11.23
webhacking.kr 038  (0) 2019.11.23
webhacking.kr 032  (0) 2019.11.23
webhacking.kr 026  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

LOG를 injection하는 문제이다.

뭔소린지 잘 모르겠다...

일단, 아무 값이나 넣고 login을 테스트 해보면 별다른 동작이 수행되지 않는다.

Admin 버튼을 눌러보면 그동안 입력했던 값들이 로그 형태로 표시된다.

admin으로 로그인을 시도해 보면 admin이 아니라고 오류를 낸다.

늘 그렇듯이 admin을 따면 뭔가 될것 같다.

로그를 다시 보고 php가 생성해낸 값을 정확히 알기 위해 소스를 확인해본다.


<html>
<head>
<title>log viewer</title>
</head>
<body>
<!--

hint : admin

-->
log<br>115.145.170.90:admin1
<br>211.36.147.139:f
<br>211.36.147.139:f
<br>219.254.222.210:abc
<br>219.254.222.210:def
<br><br></body>
</html>

무슨 의미가 있는지는 잘 모르겠지만, 제목이 LOG INJECTION인걸 보니 admin으로 정상 로그인한 것처럼 로그를 넣어보고 싶어진다.

마지막 로그를 따서 abc<br>219.254.222.210:admin 을 넣어보자.

로그인을 해봐도 별달리 수행되는게 없는 것같다. 다시 Admin버튼으로 로그를 확인해보면 어느샌가 풀려있는 문제를 볼 수 있다....

'writeups > Web' 카테고리의 다른 글

webhacking.kr 047  (0) 2019.11.23
webhacking.kr 039  (0) 2019.11.23
webhacking.kr 032  (0) 2019.11.23
webhacking.kr 026  (0) 2019.11.23
webhacking.kr 025  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 150

Author: Jisoon Park(js00n.park)

Description:

Write-up

RANK가 있는 걸로 봐서는 뭔가 순위를 보여주는 페이지인것 같다.

아무 ID(여기서는 younghero)나 클릭해보면 HIT 점수가 1 오르는 것을 볼 수 있었다.

한번 더 클릭했을 때는 no라는 메세지가 나오고 더이상 HIT 점수가 오르지 않았다.

뭐가 다르지 하고 두 번의 request 내용을 비교해 봤더니, cookie에 "vote_check=ok"라는 내용이 추가된 것을 알 수 있었다.

첫번째 request의 response를 보면 cookie가 추가되는 것을 명시적으로 확인할 수 있다.

맨 아래쪽의 join 버튼을 누르면 차트에 진입할 수 있는데, 일단 진입한거 1등을 달성해보자.

vote_check이 들어가지 않은 request를 반복적으로 보내면 될거 같다.

코딩하기 귀찮아서 burp suite의 repeater 기능을 이용했는데, 이것도 100번을 누르려니 귀찮아서 curl command로 복사(Copy as curl command)해서 결국 간단히 쉘 코딩을 하고 말았다.

#!/bin/bash

c=1
while [ $c -le 100 ]
do
    curl -i -s -k  -X $'GET' \
    -H $'Host: webhacking.kr' -H $'Upgrade-Insecure-Requests: 1' -H $'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36' -H $'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H $'Referer: http://webhacking.kr/challenge/codeing/code5.html' -H $'Accept-Encoding: gzip, deflate' -H $'Accept-Language: en-US,en;q=0.9,ko;q=0.8' -H $'Cookie:  PHPSESSID=1f2df9a71e78841959b0656b05a2cadb' -H $'Connection: close' \
    -b $'PHPSESSID=1f2df9a71e78841959b0656b05a2cadb' \
    $'http://webhacking.kr/challenge/codeing/code5.html?hit=matta'

    ((c++))
done

코드를 실행해서 투표 점수가 100점을 넘으니 문제를 해결할 수 있었다.

'writeups > Web' 카테고리의 다른 글

webhacking.kr 039  (0) 2019.11.23
webhacking.kr 038  (0) 2019.11.23
webhacking.kr 026  (0) 2019.11.23
webhacking.kr 025  (0) 2019.11.23
webhacking.kr 015  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

문제 페이지를 열어보면 일단 소스코드를 보라고 한다.

<html> 
<head> 
<title>Challenge 26</title> 
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; }     
a { color:lightgreen; } 
</style> 
</head> 
<body> 

<? 

if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } 

$_GET[id]=urldecode($_GET[id]); 

if($_GET[id]=="admin") 
{ 
@solve(26,100); 
} 

?> 


<br><br> 
<a href=index.phps>index.phps</a> 
</body> 
</html>

urldecode를 했을 때 "admin"이 되는 문자열을 넣어달라고 한다.

burp suite의 Decoder 도구를 이용해서 "admin" 문자열을 urlencode하자.

urlencode한 문자열을 GET을 통해 보내도록 되어 있는데, urlencode를 한번 한 문자열을 그대로 보내면 php에는 자동으로 decode 되어 전달된다.

자동으로 decode 되어도 문제 코드에서 다시 한번 urldecode를 수행했을 때 정상적으로 "admin" 문자열을 얻을 수 있도록 urlencode를 두번 수행한다.

얻어낸 문자열 %25%36%31%25%36%34%25%36%64%25%36%39%25%36%65을 아래와 같이 GET 메소드를 이용해서 전송하면 점수를 획득할 수 있다.

http://webhacking.kr/challenge/web/web-11/?id=%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65

'writeups > Web' 카테고리의 다른 글

webhacking.kr 038  (0) 2019.11.23
webhacking.kr 032  (0) 2019.11.23
webhacking.kr 025  (0) 2019.11.23
webhacking.kr 015  (0) 2019.11.23
webhacking.kr 014  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 150

Author: Jisoon Park(js00n.park)

Description:

Write-up

파일 목록과 텍스트가 주어진다. 소스 코드를 봐도 별다른게 없는데, 주소표시줄을 보면 file=hello라고 되어있다.

hello.txt 파일의 크기는 12 byte이고, 출력된 메세지도 (엔터까지 세면) 12 byte이므로, hello.txt 파일의 내용이 보여지는걸로 생각된다.

file=hello.txt가 아닌 것이 이상하지만, 일단 file=password.php를 넣어서 시도해보았을 때 형편좋게 password가 출력되어 주지는 않는다.

아래의 메세지 창이 hello.txt를 보여주는게 맞다면 전송한 file 문자열에 ".txt"를 붙여서 보여주는걸로 일단 가정해 보자.

password.php를 입력하면 "password.php.txt" 파일을 보여주려고 시도하게 되고, 실패하기 때문에 아마 기본인 hello.txt를 보여주는 것 같다.

php의 string concatenation을 무력화 하기 위해 password.php 뒤에 문자열 종료 문자(0x00)을 강제로 넣어보자.

file=password.php%00을 입력했을 때 정상적으로 password.php 파일의 내용이 표시되는 것을 볼 수 있다.

획득한 password를 auth 창에 등록하면 포인트를 획득할 수 있다.

'writeups > Web' 카테고리의 다른 글

webhacking.kr 032  (0) 2019.11.23
webhacking.kr 026  (0) 2019.11.23
webhacking.kr 015  (0) 2019.11.23
webhacking.kr 014  (0) 2019.11.23
webhacking.kr 004  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 50

Author: Jisoon Park(js00n.park)

Description:

Write-up

문제를 열어보면 "Access Denied"라는 경고창이 뜨고, 확인을 누르면 잠시 텍스트 창이 지나가고 문제 리스트로 돌아간다.

서버가 빠릿빠릿 할때는 순식간에 지나갔을것 같기도 한데, 지금은 몇초 후에(...) 지나간다.

지나가는 텍스트창을 캡쳐해보자.

password가 off_script라고 한다.

50점 짜리 문제니까 크게 고민은 하지 말자.

이 password를 문제목록 상단의 링크를 이용해 auth에 가서 넣어주면 점수를 획득할 수 있다.

'writeups > Web' 카테고리의 다른 글

webhacking.kr 026  (0) 2019.11.23
webhacking.kr 025  (0) 2019.11.23
webhacking.kr 014  (0) 2019.11.23
webhacking.kr 004  (0) 2019.11.23
webhacking.kr 001  (0) 2019.11.23

Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

뭔가 check를 통과할 수 있는 값을 넣어야 하는것 같다.

소스 코드를 찾아보자.

<html>
<head>
<title>Challenge 14</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<br><br>
<form name=pw><input type=text name=input_pwd><input type=button value="check" onclick=ck()></form>
<script>
function ck()
{
var ul=document.URL;
ul=ul.indexOf(".kr");
ul=ul*30;
if(ul==pw.input_pwd.value) { alert("Password is "+ul*pw.input_pwd.value); }
else { alert("Wrong"); }
}

</script>


</body>
</html>

check 버튼을 클릭하면 ck() 함수가 호출되고, document.URL()의 ".kr" 문자열의 위치에 30을 곱한 수를 넣어주면 되는 것 같다.

열심히 세어봐도 되지만, 연습할 겸 chrome의 개발자 도구를 사용해 본다.

페이지의 URL은 http://webhacking.kr/challenge/javascript/js1.html 이므로, ".kr"은 17번째 문자임을 알 수 있고, 여기에 30을 곱한 510을 넣어주면 password를 알려준다.

이 password를 문제목록 상단의 링크를 이용해 auth에 가서 넣어주면 점수를 획득할 수 있다.

'writeups > Web' 카테고리의 다른 글

webhacking.kr 025  (0) 2019.11.23
webhacking.kr 015  (0) 2019.11.23
webhacking.kr 004  (0) 2019.11.23
webhacking.kr 001  (0) 2019.11.23
tmitter  (0) 2019.11.23

+ Recent posts