参考:
【Bugku】sqli-0x1_bugku sqli-0x1-CSDN博客文章浏览阅读1k次,点赞7次,收藏3次。文章详细描述了一个PHP脚本的安全漏洞,涉及到了错误报告关闭、is_trying_to_hak_me函数的失效、SQL注入尝试以及使用SHA256加密的登录验证。通过联合注入利用,攻击者可以轻易获取登录权限。https://blog.csdn.net/weixin_73625393/article/details/137773172
F12查看
根据注释查看php源代码
<?php
error_reporting(0);
error_log(0);
require_once("flag.php");
function is_trying_to_hak_me($str)
{
$blacklist = ["' ", " '", '"', "`", " `", "` ", ">", "<"];
if (strpos($str, "'") !== false) {
if (!preg_match("/[0-9a-zA-Z]'[0-9a-zA-Z]/", $str)) {
return true;
}
}
foreach ($blacklist as $token) {
if (strpos($str, $token) !== false) return true;
}
return false;
}
if (isset($_GET["pls_help"])) {
highlight_file(__FILE__);
exit;
}
if (isset($_POST["user"]) && isset($_POST["pass"]) && (!empty($_POST["user"])) && (!empty($_POST["pass"]))) {
$user = $_POST["user"];
$pass = $_POST["pass"];
if (is_trying_to_hak_me($user)) {
die("why u bully me");
}
$db = new SQLite3("/var/db.sqlite");
$result = $db->query("SELECT * FROM users WHERE username='$user'");
if ($result === false) die("pls dont break me");
else $result = $result->fetchArray();
if ($result) {
$split = explode('$', $result["password"]);
$password_hash = $split[0];
$salt = $split[1];
if ($password_hash === hash("sha256", $pass.$salt)) $logged_in = true;
else $err = "Wrong password";
}
else $err = "No such user";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Hack.INI 9th - SQLi</title>
</head>
<body>
<?php if (isset($logged_in) && $logged_in): ?>
<p>Welcome back admin! Have a flag: <?=htmlspecialchars($flag);?><p>
<?php else: ?>
<form method="post">
<input type="text" placeholder="Username" name="user" required>
<input type="password" placeholder="Password" name="pass" required>
<button type="submit">Login</button>
<br><br>
<?php if (isset($err)) echo $err; ?>
</form>
<?php endif; ?>
<!-- <a href="/?pls_help">get some help</a> -->
</body>
</html>
is_trying_to_hak_me
函数:这个函数检查传入的字符串是否包含黑名单中的字符,这些字符可能用于SQL注入或其他攻击。如果发现这些字符,函数返回
true
,表示用户可能在尝试攻击
if (is_trying_to_hak_me($user))
:如果用户输入的用户名包含黑名单中的字符,脚本会输出 "why u bully me" 并终止执行
$split = explode('$', $result["password"]);
:将数据库中的密码拆分为哈希值和盐值
if ($password_hash === hash("sha256", $pass.$salt)) $logged_in = true;
:检查提交的密码和盐值组合后的哈希值是否与数据库中的哈希值匹配
也就是说,先自己确定一个密码和盐,比如password “123”和salt “1”,然后得到经过sha256加密的hash值
根据真正的password分割原则,得到伪造记录 hash$1
然后根据联合注入
得到用户名Username:admin'union select 1,'hash$1
那么输入的密码password:123
admin'union select 1,'52a6eb687cd22e80d3342eac6fcc7f2e19209e8f83eb9b82e81c6f3e6f30743b$1
最后根据下面的代码求得hash,代入进去即可
生成密码为“123”,盐为“1”的hash
版权归原作者 qq_51145360 所有, 如有侵权,请联系我们删除。