");
while($row = mysql_fetch_assoc($query)) {
echo("{$row["name"]}{$row["text"]}");
}
echo("");
?>我试图在这段代码中找到SQL注入。我尝试过不同的方法,但没有成功。线索是“在这个代码示例中尝试查找逻辑错误”。我知道DB有可能使用GBK (或其他什么)编码,我们可以使用多字节字符来破坏语句。但在这种情况下是不合适的。
我不明白为什么我们要在addslashes上做$ip。这似乎没有必要。也许这是条线索。
发布于 2019-05-04 03:41:57
感谢彼得帮助解决细节问题
诀窍是将add_slashes应用于IP地址,然后将截断为15个字符。想象一下将其注入$_SERVER["REMOTE_ADDR"]或$_SERVER['HTTP_X_REAL_IP'] (第15个字符是单引号):
12345678901234'
add_slashes将其转化为:
12345678901234\'
它被截断为:
12345678901234\
换句话说,现在您有一个单独的尾随斜杠,它将避开本应结束查询中IP地址值的单引号。您现在已经修改了查询本身。用户代理值的开头引号现在关闭IP地址值,用户代理中的任何内容都直接插入到查询中,而不包含任何引号。您只需确保完成后构建一个有效的查询即可。将数据注入$_SERVER['REMOTE_ADDR']是很困难的,因为尽管您可以在TCP请求上伪造数据,但这将破坏握手,并且HTTP请求永远不会发生。但是,设置$_SERVER['HTTP_X_REAL_IP']就像在请求上设置一个标头一样简单。因此,一些类似的东西会起作用(这是一个未经测试就匆忙拼凑在一起的例子):
curl 'https://target.com' \
-H "X-REAL-IP: 12345678901234'" \
--user-agent '1,1,1); INSERT INTO message (name) SELECT
CONCAT(Host,User,authentication_string) from mysql.user; --'请注意,这个特殊的示例之所以可能,是因为使用了旧的mysql_query绑定。mysqli库显式禁止在每个execute语句中有多个查询。
发布于 2019-05-03 21:34:48
remote_addr和user_agent字段都被发送到SQL,而没有被解析。尝试将SQL查询作为GET或POST参数插入用户代理字段。
/endpoint?HTTP_USER_AGENT='
/endpoint?HTTP_X_REAL_IP='下面的代码询问服务器是否设置了_SERVER元素。
if(isset($_SERVER["HTTP_X_REAL_IP"])) {
$ip = $_SERVER["HTTP_X_REAL_IP"];
}这是触发SQL查询的易受攻击代码,因此是注入:
$query = mysql_query("INSERT INTO `message` (`remote_addr`, `user_agent`, `name`, `text`) VALUES('{$ip}',
'{$user_agent}', '{$name}', '{$text}');", $link);
}这可能意味着GET、POST或COOKIE参数。将此参数设置为:如我前面提到的,在您的http请求中将HTTP_X_REAL_IP设置为',将触发SQL错误。你为什么不试试呢?
https://security.stackexchange.com/questions/209479
复制相似问题