?
看到网页界面很容易想到MySQL注入,所以尝试一下常规的注入方法:
username= a' pr 1=1#? ? ?、pass随意?
发现这个题目远不止这么简单,正则表达式过滤了我浅薄知识范畴里可以想到的所有注入姿势。
后来又百度了很多注入方法,一一尝试都不成功。
无奈之下只能用dirsearch尝试搜索后门:
?
?
结果发现了一个www目录(可能是网站根目录?)的zip包?
发现里面有一个index.php文件和一个sql文件
<html>
<head>
<meta charset="UTF-8">
<title>Can You Hacked me?</title>
</head>
<body>
<h1>Can You Hacked me?</h1>
<form method="get">
Username: <input type="text" name="username"> <br>
Password: <input type="text" name="password"> <br>
<input type="submit">
</form>
<pre>
<?php
include "flag.php";
error_reporting(0);
function waf1($inject) {
preg_match("/'|union|select|&|\||and|or|\(|,/i",$inject) && die('return preg_match("/\'|union|select|&|\\||and|or|(|,/i",$inject);');
}
if(isset($_GET['username']) && isset($_GET['password'])) {
$username = $_GET['username'];
$password = $_GET['password'];
waf1($username) || waf1($password);
if (strtolower($_GET['username']) == 'admin' && $_SERVER["REMOTE_ADDR"] != '127.0.0.1') {
die('Admin only allow to login at localhost');
}
$conn = new mysqli("127.0.0.1","root","root","supersqli");
$sql = "select * from `users` where username = '$username' and password = '$password';";
$result = $conn->query($sql);
echo $sql . '<br>';
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
if($row["username"] === 'admin') {
echo 'Welcome Admin, here is your flag: ' . $flag;
} else {
die("You are not Admin.");
}
}
} else {
echo "Result Not Found!";
}
$conn->close();
}
?>
</pre>
</body>
</html>
CREATE DATABASE IF NOT EXISTS supersqli;
USE supersqli;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) NOT NULL,
`username` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `users` values(1,'test', 'test'),(2,'admin','AdminSecret');
发现居然存储了admin的密码,赶快去网站登陆admin,得到提示:
Admin only allow to login at localhost
?并不能登陆admin,而登陆test账号是无法得到flag的。
但是可以尝试上一篇博客(189条消息) MySQL约束攻击的原理和复现_bouIevard的博客-CSDN博客
中所说的MySQL约束攻击的原理,我们直接输入admin不能够登陆,但是可以输入一个超长字符串‘admin? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?’来实现登陆,然后拿到flag。
|