Wargame

10번 문제이다. 들어가면 이상하게 생긴 페이지가 하나 나온다.




소스코드를 보자...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>Challenge 10</title>
</head>
 
<body>
<hr style=height:100;background:brown;>
<table border=0 width=900 style=background:gray>
<tr><td>
<a id=hackme style="position:relative;left:0;top:0" onclick="this.style.posLeft+=1;if(this.style.posLeft==800)this.href='?go='+this.style.posLeft" onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O</a><br>
<font style="position:relative;left:800;top:0" color=gold>|<br>|<br>|<br>|<br>buy lotto</font>
</td></tr>
</table>
<hr style=height:100;background:brown;>
 
</body>
</html>
cs


이렇다.  중간에 보이는

<a id=hackme style="position:relative;left:0;top:0" onclick="this.style.posLeft+=1;if(this.style.posLeft==800)this.href='?go='+this.style.posLeft" onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O</a><br>
<font style="position:relative;left:800;top:0" color=gold>|<br>|<br>|<br>|<br>buy lotto</font>

이 부분이 중요한것같다. 그럴게 id부터가 hackme이다.


<a>O</a>가 되있는 저 O를 onclick을 통해서 this.style.posLeft를 증가시키고 이 값이 800이면 이동하게 되는것같다.


url에 바로 ?go=800이라 쳐보았지만 no hack이라며 거절당햇다.



아마 go값뿐만 아니라 O의 위치값도 제대로 800값이여야할것같다. 


뭐 이런... 일단 크롬 개발자 도구를 이용해서 수정하고 해보았지만 안된다 ㅜ; 


근데 이상하게 저 코드를 보면 저 O를 클릭하면 위치가 오른쪽으로 이동해야하는데 안한다 ㅡㅡ; 그래서 Internet Explorer로 들어가서 눌러보니 이동하는것을 확인할 수 있었다..(응? 왜 크롬은 안돼 ㅡ;)



저까지 달렸다... 참고로 이게 마우스를 O에 가져다올리면 yOu 로 변하고 다시 내리면 O가 된다. 뭔가 달리기하는거 같다.

열심히 저기까지 달리자 ㅂㄷㅂㄷ;

onmouseover=this.innerHTML='yOu' onmouseout=this.innerHTML='O'>O</a>


아오... 누르다가 힘들어서 오토마우스써서 해보았다.




오잉 ㅋㅋㅋㅋ 이게 아닌거같은데


일단 나중에 와서 다시 풀어봐야겠다.



수정 + 2018-03-23


크롬으로 수정했을때는 저 posLeft값이 변한다해도 O가 움직이지 않아서 실패했었다.


방금 알았는데 Internet Explorer도 F12를 누르면 개발자 도구가 나온다. 여기서 수정해주자.




풀리긴하지만 이미 풀었다고 클리어표시는 안내준다.





오랜만에 다시 Webhacking.kr 에 들어가 새로 문제를 풀어보았다.


예전 포스팅들과 달리 이번에는 이미지 첨부가 가능하기에 되도록 이미지를 첨부하면서 풀어보도록하겠다.


이번 문제는 들어가면 아래와 같이 보인다.




javascript challenge라고 나온다.


소스보기로 소스코드를 보면 WorkTimeFun이란 곳에 String이 저장되어있는것을 알 수있다. 

그런데 그 스트링은 아스키코드값을 하나하나 분리해놓았다 ㅡㅡ; 





하지만 우리에겐 크롬 개발자도구가 있다!


그대로 콘솔창에 넣어보자.



오호... 위와 같이 출력되었다.


ck값이 Password로 출력되는 것을 보니 ck값을 구하면 될 것 같다.


ck 값은 url에서 =뒤로 출력되는 것들이고.. 이 값이 if문을 통과하게 되면 alert로 띄워주게 되니;


저 if문의 조건에 부합하는 ck 값을 찾아야할 것 같다.


저 코드에서 ck값을 역으로 추출하게 코드를 약간 수정해서 크롬 개발자도구의 콘솔을 이용해 출력해보았다.



=youaregod~~~~~~~! 가 ck값으로 들어가면 되는 값일 것이다. 그대로 url에 붙여넣어 보내보자


사실... 출력해주는게 ck 값이라 딱히 url에 안넣어봐도 된다.



저걸 Auth에 입력하면 인증된다.



클리어 ㅇㅇ



 



BLIND SQL INJECTION

Result :


문제다. Blind sql injection이라고 적혀있다.


일단 소스보기!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<title>Challenge 21</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body><br><br>
<center>
<form method=get action=index.php>
<table border=0 align=center cellpadding=10 cellspacing=0>
<tr><td colspan=2 align=center><h1>BLIND SQL INJECTION</h1></td></tr>
<tr><td align=center><input name=no type=text size=30></td><td><input type=submit></td>
<input type=hidden name=id>
<input type=hidden name=pw>
</tr><tr><td colspan=2 align=center style=background:silver;color:black;font-size:9pt;>Result : <b>
</b></td></tr></table>
</form>
</center>
</body>
</html>
cs


get방식으로 index.php에 보낸다.

일단 보내보면... 위에 get방식으로 어덯게 보내지는지 보인다.


/index.php?no=hi&id=&pw=


제출되는 것은 no로 넘버인것 같다.


0을 입력하면 Result는 아무것도 뜨지않는다.


1,2 를 입력하면 True가 뜬다.


3,4~ 부터는 False가 뜨는 것 같다.







[Webhacking.kr] 20번

2017. 10. 12. 22:26
time limit : 2
nickname
comment
code

do not programming!
this is javascript challenge


문제다.


소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<html>
<head>
<title>Challenge 20</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body>
<center><font size=2>time limit : 2</font></center>
<form name=lv5frm method=post>
<table border=0>
<tr><td>nickname</td><td><input type=text name=id size=10 maxlength=10></td></tr>
<tr><td>comment</td><td><input type=text name=cmt size=50 maxlength=50></td></tr>
<tr><td>code</td><td><input type=text name=hack><input type=button name=attackme value="hlajbgotso"
 style=border:0;background=lightgreen onmouseover=this.style.font=size=30 onmouseout=this.style.font=size=15></td></tr>
<tr><td><input type=button value="Submit" onclick=ck()></td><td><input type=reset></td></tr>
</table>
<script>
function ck()
{
 
if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; }
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; }
 
lv5frm.submit();
 
}
</script>
 
<br>
 
do not programming!<br>
 
this is javascript challenge
 
</body>
</html>
 
cs


POST로 nickname comment code를 전송하는 형식같다.


form의 이름은 lv5frm이다. code 라는 부분이 중요해 보인다. name=hack이고 옆에 있는 hlajbgotso값을 가진 버튼은 name=attackme이다.


아... 방금 알았는데 저 옆에 있는 버튼 attackme의 값은 계속해서 바뀐다.(새로고침할때마다 변함)


Submit 버튼을 누르면 ck()가 작동한다.


function ck()
{
 
if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; }
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; }
 
lv5frm.submit();
 
}



nickname, comment, hack 값이 없다면 focus로 커서를 입력칸으로 이동하고 return 되어 함수를 빠져나온다.

또 hack의 값과 attackme의 값이 동일하지않으면 focus후 함수를 빠져나온다.


이제 어떻게 동작하는지 알았으니... 적당히 입력한 후 (물론 code값(hack)과 그 옆에 랜덤으로 변하는 값(attackme)과 같게 해야한다.)


Submit해보았다. Wrong이 떳다.


... 흠... 일단 문제는 do not programming과 javascript challenge라고 한다.


위에 적힌 time limit : 2 가... 2초안에 입력해야한다는 것을 뜻하는 것 같다. 왜냐하면 늦게하면 Wrong이 나온다.

(왜 2초라 생각하였냐면... 그냥 크롬 개발자 열어놓고 Console에 lv5frm.submit();만 보내면 Wrong은 뜨지않는다.)


그래서 아래와 같이 미리 준비해둔 자바스크립트문을 적어서 복사해뒀다가...


새로고침하고 개발자도구 Console을 통해서 보내보았다.


1
2
3
4
lv5frm.id.value="sherlock"
lv5frm.cmt.value="Clear~~~"
lv5frm.hack.value=lv5frm.attackme.value
lv5frm.submit();
cs


결과는 성공~ 2초안에 성공하는게 맞았나 보다.






You have cleared the 20 problems.

Score + 200




이런...


7번. nice try만 뜬다고 함.. 안해봐서 모름


19번.. 안됨.. 씁...

'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 21번 BLIND SQL INJECTION  (0) 2017.10.12
[Webhacking.kr] 20번  (0) 2017.10.12
[Webhacking.kr] 58번  (0) 2017.10.09
[Webhacking.kr] 54번  (0) 2017.09.28
[Webhacking.kr] 47번 Mail Header injection  (0) 2017.09.28

[Webhacking.kr] 58번

2017. 10. 9. 23:31

문제에 들어가면 


webhacking.kr challenge 58


PW : 


      login 



이렇게 나와있다.


아무거나 패스워드를 입력하고 login을 누르면 Wrong이라고 뜬다.


일단 소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<title>Challenge 58</title>
</head>
<body bgcolor=black>
<br><br><br>
<center>
<script src=kk.js></script>
</center>
</body>
</html>
cs


이렇다. kk.js가 띄워지는게 다다.


ks.js를 눌러보았다.


kk.js의 내용

kk=document.URL; kk=kk.substr(10,4);

위와 같은 게 있다. 


kk에 url을 인덱스 10부터 4개의 문자를 저장한다.


음... 크롬 개발자도구로 보니, 더 있었다...;;


1
2
3
4
5
<center>
<script src="kk.js"></script>
<script src="kk2.js"></script>
<embed src="hackme.swf" width="500" height="400">
</center>
cs



kk2.js의 내용도 알 수 있고, hackme.swf를 볼 수도 있다.

hackme.swf는 글의 맨 위에 있는 pw와 login창이다.


kk2.js의 내용

kk=kk+"me.swf";
document.write("<embed src="+kk+" width=500 height=400></embed>");


음... 이제 좀 알 것 같이 되었다.

kk~kk2의 내용들은 이렇게 된다.


kk = http://webhacking.kr/challenge/web/web-35/

kk = kk.substr(10,4) = hack

kk = kk+"me.swf" = hackme.swf


document.write(<embed src="hackme.swf" width="500" height="400">);


위는 뭐 어떻게 할수 없을 것 같다.


일단 hackme가 중요하니 이걸 풀면 될 것같다.


http://webhacking.kr/challenge/web/web-35/hackme.swf 를 하자 hackme.swf가 다운로드되었다. (시크릿모드에서)

아니면 크롬-도구더보기-페이지를 다른 이름으로 저장 하면된다.


뭐... 저걸 분석할 툴은 hexediter 등을 이용하면 된다. 하지만 지금(필자입장)은 그런게 없어서... 급한대로 메모장으로 열었다.


맨 끝에 보면 http://webhacking.kr/challenge/web/web-35/g1v2m2passw0rd.php 라는것을 발견할 수 있었다.


url로 들어갔더니 성공...





You have cleared the 58 problems.

Score + 150



[Webhacking.kr] 54번

2017. 9. 28. 23:55

Password is


문제에 들어가면 위의 문장이 하나 떠있다. 조금 기다리면

Password is 뒤에 한글자씩 문자가 나온다. 아마 Password를 한글자씩 알려주는 것 같다...


일단 소스를 보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<html>
<head>
<title>Challenge 54</title>
</head>
<body>
<h1><b>Password is <font id=aview></font></b></h1>
<script>
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
x=run();
 
function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
if(x.responseText=="") aview.innerHTML="?";
}
 
setTimeout("answer(0)",10000);
 
</script>
</body>
</html>
 
cs


뭐가 엄청 복잡하다. 일단 answer이라는 함수가 중요해보인다.


이 함수는 setTimeout함수를 통해 실행된다. 자바스크립트에서 setTimeout함수는 어떤것인지 먼저 보겠다.


setTimeout([Function], [Milliseconds])

 

 - 특정 시간 이 후, 단 한번만 특정 함수 또는 코드를 실행시킬 때 사용합니다.

 - 2번째 인자의 시간(Milliseconds)이 경과하면 1번째 인자의 함수를 실행합니다.


그러므로 setTimeout("answer(0)",10000); 이 부분은 10000ms , 10초 후에 answer함수에 인자 0을 넣어 실행하라! 라는 의미이다.


실제로 문제페이지에서 10초를 기다리면 그 때부터 문자가 하나씩 나오기 시작한다.


뭐 저걸 하나하나 일일이 적어서 봐도 되긴하지만 그러기엔 너무 귀찮으므로... 크롬 개발자도구를 이용해서 위의 자바스크립트부분을 조금 수정하면


하나씩 뜨던걸 바꿀수 있지 않을까 싶다.


계속해서 answer 함수부분을 보자


function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
if(x.responseText=="") aview.innerHTML="?";
}


보면 재귀로 이루어져있는 것을 볼 수 있다. x.responseText값이 없을 때가 재귀에서 탈출하는 조건이고


값이 있다면 100ms, 0.1초 후 answer함수를 i+1한 걸로 호출한다.(i++)


그럼 작동방식은 어떻게 되나 살펴보자, x=run()인데 run을 통해서 무언가를 x에 저장한다.

x.open('GET','?m='+i,false); // x에서 GET방식으로 m에 i를 해서 페이지를 연다.
x.send(null);                   // 첫줄에서 GET방식으로 연것을 보낸다.
aview.innerHTML=x.responseText; // html페이지로 x.responseText값을 노출시킨다.
i++;


이러고 재귀로 돌아간다. aview.innerHTML의 값이 0.1초마다 계속 다른 값으로 대입되므로 바뀌게 되는 것이다.


그러므로 이 부분을 aview.innerHTML+=x.responseText; 로 바꾸면 값이 대입되어 바뀌는게 아니고 계속 추가되는 것이므로 

계속 출력될 것을 알 수 있다. 또 if(x.responseText=="") aview.innerHTML="?"; 이 부분은 x.responseText 값이 없으면 ?로 바꾸는 부분이므로

지워버리는게 좋을 것같다.


이제 크롬 개발자도구로 수정해보자.


수정된 소스는 아래와 같다.


...는 안되서 그냥 밑과 같은 것을 개발자도구에서 Console에 입력했다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
x=run();
 
function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML+=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
}
answer(0);
 
 
cs



밑과 같은게 출력됬다. 중간을 *로 하겠다.

a64**************************f8e

정답을 Auth에 입력하면 클리어된다.


challenge 54 clear!!

Mail Header injection

*서버문제로 mail함수는 주석처리 해놓은 상태이며 취약점을 공략할 수 있는 구문을 입력했을 때
정답이 출력되도록 하드코딩 해놨습니다.

Mail :


문제는 이렇게 되있다.


소스보기를 했을 때 주석을 통해 index.phps의 존재를 알 수 있다.


index.phps를 통해 소스를 보겟다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<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>
cs


위와 같다.


post방식으로 POST[email]을 입력받는다.


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

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


그 뒤 위와 같은 처리를 한다.


php mail함수에 대한 내용은 여기에 있다. 


간단히 요약해 말하면 mail(받난사람, 제목,  내용, 참조(추가헤더정보)) 이다.

그렇다면 위 코드에 따르면 아래와 같이 된다.


받는 사람  : admin@webhacking.kr

제목         :  readme

내용        : password is *****

헤더        : From $_POST[email]\r\n


여기서 mail header injection을 구글 등을 통해 검색해보면 header에 cc 와 bcc 등이 취약하다고 나와있다.

뭐 참고로하기 위해 여러가지 나열해보자면 아래와 같이 있다.


1. 발신자 인수 후 참조 및 숨은 참조 삽입

보낸 사람: sender@domain.com%0ACc: recipient@domain.co.%0ABcc:recipient2@domain.com

이러면 이메일이 받는 사람이외에도 recipient과 recipient2에게도 보내진다.


2. 주입 인자

보낸 사람: sender@domain.com%0ATo: attacker@domain.com

이제 메세지가 원래 수진자와 공격자 계정으로 전송된다.


3. 제목 인수 삽입

위조된 주제의 제목으로 ...

4. 메세지 본문 변경

가짜 메세지를 원본 메세지에 추가하는 인젝션... 


등등... 자세한건 찾아보자!


cc(Carbon Copy, 참조) : 수신자 외 다른 사람에게도 수신

bcc(Blind Carbon Copy, 숨은 참조) : 수진자 외 다른 사람에게도 수신(수신자에게 보이지않음)


우리는 이 header의 내용을 수정할 수 있고 이 cc 옵션을 이용하여 password가 적힌 이메일을 다른 사람에게도 보낼수 있다.

그러므로 이 cc를 이용해 자신에게 이 password가 적힌 내용을 보낼 수 있다.


php mail함수 설명에 따르면 (From, Cc, Bcc) 여러 추가 헤더는 CRLF(\r\n)로 구분해야 합니다.라고 한다.

그러므로 post로 보낼 내용은 밑과 같이 할 수 있다.


TEST@test.test\r\n cc:myemail@tistory.com


참고로 이 문제는 *서버문제로 mail함수는 주석처리 해놓은 상태이며 취약점을 공략할 수 있는 구문을 입력했을 때 정답이 출력되도록 하드코딩 해놨습니다. 라고 하므로 이렇게만 입력해도 정답이 출력될 것이라 본다.


라고 생각했는데 안된다 으그ㅡ.ㅁ.

왜 안되나 생각했는데... mail함수를 주석처리인듯... 취약점을 공략할 수 있는 구문이라 생각했는데 뭐... \r\n이 제대로 안들어가는 듯 ㅠ;


파로스(paros)를 써야겠다. 파로스 사용법은 알아서.... (도구 - 인터넷 옵션 / 연결 - lan설정 - 프록시서버 사용)

아니면 버프슈트(Burp Suite)도 나쁘지 않다. 


버프슈트(Burp Suite) : POST형식으로 전송되는 값을 볼 수 있고, 값도 조작 가능


ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ 여기서 이거 사용하려면 설치하기가 너무 힘들어 ㅁㄴㅇㄹ JDK부터 귀찮아서 일단 뒤로 미룸 ㅡㅡ;;




수정 + 2018.03.25


파로스를 쓰려고 하였다. 결론부터 말하자면 64비트 JDK 안지우면 불가능했다 ㅡㅡ;;

근데 저걸 지우면 내가 지금까지 쓰던 이클립스가 구동이 안된다...

그렇다고 이클립스를 이제와서 32비트로 갈아치우자니 나중에가면 이클립스에 문제가 생길거같아서 하루종일 64비트삭제없이 32비트만 설치해서

구동시키는 법을 알아보았다.

결론은 그런거는 없었다 ㅁㄴㅇㄹ


그래서 버프슈트를 쓰기로 하였습니다.


먼저 프록시 서버를 설정하고 (간편하게 크롬 확장도구로 Falcon Proxy를 사용)


Mail에 아무값이나 집어넣고 제출한것을 Intercept로 잡았습니다.




Post방식으로 보내는 email 파라미터값이 보인다. 이제 저값을 TEST@test.test\r\n cc:myemail@tistory.com와 같이 수정해주자.



그리고 Foward해서 파라미터가 수정된 Request를 보내니 문제가 풀렸다.









'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 58번  (0) 2017.10.09
[Webhacking.kr] 54번  (0) 2017.09.28
[Webhacking.kr] 39번  (0) 2017.09.28
[Webhacking.kr] 38번  (0) 2017.09.25
[Webhacking.kr] 33번  (0) 2017.09.21

[Webhacking.kr] 39번

2017. 9. 28. 22:34

문제다. 입력창과 제출버튼이 있다.


소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<!-- index.phps -->
 
 
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
</body>
</html>
cs

위와 같다. 

친절하게 index.phps를 제공해준다.

바로 보도록하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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>
 
cs


POST로 id를 받아서 필터링을 거쳐 query에 넣는다.


필터링으로는 \을 없애고, 싱글쿼터(')을 싱글쿼터 2개('')로 바꾼다.


그리고 substr(문자열, 시작index, 길이) 함수를 이용해 앞 15글자를 잘라서 $_POST[id]에 저장하고 다음 쿼리에 넣는다.


select 'good' from zmail_member where id='$_POST[id]


그리고 이 결과 q[0] 값이 "good"이라면 solve이다.


일단 제출값으로 아무값이나 넣어봤다... 오류가 뜬다. 

아마 위 쿼리문의 마지막 '(싱글쿼터)가 없어서 오류가 뜨는 것같다.


그런데 저 값이 필터링에 의해 바뀌어 버리니...;;


그런데 여기서 싱글 쿼터가 2개가 되는 이 상황에서 싱글쿼터를 1개로 만들 방법이 substr함수에 있다.

POST[id]값이 15자를 넘어가게 되면 0-15까지만 짤라서 사용하므로 만약 싱글쿼터가 15번째에 위치한다면 

replace에 의해 16번째에 생기게 된 싱글쿼터 하나가 짤리게 될 것이다.


이제 입력하자 admin+(공백)*9+'를 하면 될 것 같다.

admin         '






You have cleared the 39 problems.

Score + 100


참고로 admin말고도 (good          ')을 입력해도 성공한다.


'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 54번  (0) 2017.09.28
[Webhacking.kr] 47번 Mail Header injection  (0) 2017.09.28
[Webhacking.kr] 38번  (0) 2017.09.25
[Webhacking.kr] 33번  (0) 2017.09.21
[Webhacking.kr] 32번  (0) 2017.09.18

[Webhacking.kr] 38번

2017. 9. 25. 23:50

LOG INJECTION

 



이렇게 있다. 소스보기!!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<html>
<head>
<title>Challenge 38</title>
</head>
<body>
<h1>LOG INJECTION</h1>
<!-- admin.php -->
 
<form method=post action=index.php>
<input type=text name=id size=20>
<input type=submit value='Login'><input type=button value='Admin' onclick=location.href='admin.php'>
</form>
</body>
</html>
 
cs


 Login과 Admin 버튼이 있는데 Admin버튼을 눌러 admin.php에 들어가면


log viewer가 나온다. 소스보기!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<html>
<head>
<title>log viewer</title>
</head>
<body>
<!--
hint : admin
-->
log<br><br><br></body>
</html>
 
cs


힌트가 admin이라고 한다.


admin을 입력하고 login을 눌러보았다. 


you are not admin

이라고 뜬다. 혹시 몰라 guest나 다른 단어를 입력해보았으나 아무일도 일어나지 않았다.


한참 입력하다가 Admin버튼을 다시 누르니 지금까지 입력한 log가 나왔다.

참고로 admin은 로그에 남지 않는다. 실패해서 그런가 싶다.


다음날 다시 log보기를 해봤다.

다른 사람이 한것까지 나오는듯 하다. 신기하네...


211.***.150.***:211.***.150.***:admi 
119.197.***.***:<script> 
119.197.***.***:<script>alert(0)<script> 
121.173.***.***:ㅊㅍㅋ 
221.160.***.***:a 


log에 나오는 내용은 


자신의 ip:입력내용  이다.

log injection을 해야하는 듯하다. 즉 log에 내 아이피로 admin을 찍으면 될듯 하다.


재미있는건 123admin이나 admin!!! 입력해도 필터링에 걸리지 않는다.

즉 admin을 로그에 남기기 위해 admin뒤에 로그에는 남지않는 부분을 붙이면 될것같다.

뒷부분을 날려버리기 위해 개행문자(\n)을 이용하였다.


admin\n 을 입력하면 로그(log)에 123.123.123(자신의 ip):admin이 들어가고 개행문자에 의해 다음행으로 넘어가므로 admin이 로그에 남게될것이다.






You have cleared the 38 problems.

Score + 100





뭐... 방법은 여러가지 있는 것 같다.


입력내용에 asdf\n(자신의ip):admin 으로 푼 사람도 적지않게 있는듯


이렇게 하면 로그에 남는 것은 아래와 같다.


자신의 ip:asdf

자신의 ip:admin


마찬가지로 성공한다.... 로그에 남았으니



'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 47번 Mail Header injection  (0) 2017.09.28
[Webhacking.kr] 39번  (0) 2017.09.28
[Webhacking.kr] 33번  (0) 2017.09.21
[Webhacking.kr] 32번  (0) 2017.09.18
[Webhacking.kr] 27번  (0) 2017.09.06

+ Recent posts