通过 addlashes 进行 SQL 注入

信息安全 php sql注入 mysql
2021-08-19 14:27:16

我正在尝试了解如何通过addslashes在 PHP 和 MySQL 中出于教育目的来攻击网站。

在阅读了这个主题这个主题之后,我试图了解它如何绕过类似0xbf27可以0xbf5c27通过 using转换为的东西addslashes

所以我手动执行一个查询来设置字符集。

set character set 'gbk'; 

用于此目的的字符必须bf27。根据他们在上述主题中所说的,它必须转换为类似的东西,bf5c27但是当我在实验室中使用这样的 PHP 代码对其进行测试时:

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '".addslashes($id)."';";
echo $query;
$result = mysql_query($query) or die( '<pre>' . mysql_error() . '</pre>' );

当我在我的文本字段中插入时,执行的确切查询是:

SELECT first_name, last_name FROM users WHERE user_id = '뼧';

所以似乎没有什么特别的事情发生!

在此之后,我尝试构建另一个 PHP 脚本以了解发生了什么,因此我构建了一个没有任何 MySQL 执行(test.php)的简单脚本,例如:

 <html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php 
$command = $_REQUEST[ 'id' ];;
$output = addslashes($command);
echo "<pre>$output</pre>"; ?> 
 </body>
</html>

然后我使用如下 URL 执行文件:

http://127.0.0.1/test.php?id=뼧

如果你看到上面的 PHP 代码,它会回显:

뼧 

以上3个字符的十六进制代码为:

eb bc a7

好吧,我只是想想发生了什么,

我的问题是:

  1. 它向我展示了什么뼧?(这似乎有些不寻常,因为它不包含类似的东西5cor 27

  2. 为什么第一个脚本没有显示类似上述三个字符的内容echo $query;

  3. 我怎样才能真正像他们描述的那样执行它(在上述 2 个主题中)?

更新 1: 感谢Goktay Kaykusuz所说,我知道我的编码有问题。它的 POC 是我在终端上对其进行测试,结果如下:

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <pre>뼧</pre> </body>
</html>

所以我知道它将结果转换为 UTF8(在 Chrome 中)但在终端中正常工作。

但是问题仍然存在,因为它无需任何奇妙的绕过即可工作(这正是一个简单的字符串应该是的。)

1个回答

有趣的是,我尝试了一个在线编码转换器。我认为您在客户端有编码问题。

当我将字符串嵌入到 PHP 代码中时,它起作用了。

$test_var = chr(0xbf) . chr(0x27);
echo(bin2dex(addslashes($test_var)));

结果: bf5c27

问题是当您从 URL 获取变量时:

在 addlashes() 结果之后 ebbca7

¿' 在 addlashes() 导致 bf5c27

在线编码转换器显示bf27forbf 27for ¿'

您能否在 php.ini 中将 PHP 配置的编码设置为 GBK 和 UTF-8,然后再尝试使用这些¿'字符?您提供的链接中的示例不会直接回显输出,因此您可能已经在客户端被打乱了,正如我所提到的。