MySQL注入渗透

MySQL注入渗透,mysql,sql,code-injection,Mysql,Sql,Code Injection,我是新来的,所以我会尽量使我的帖子清晰易读 在浏览某个网站的日志时,我遇到了一些黑客企图,我想在一个封闭的服务器上重新创建/测试。我制作了一个简单的PHP网页,它获取一个名为“id”的变量,并且在查询中不进行任何过滤/验证 相关PHP代码 $var = $_GET['id']; echo $_GET['id'] . "<br>\n"; include ( "/var/www/dbconnect.php" ); $mysqli = new mysqli ( $db_host, $d

我是新来的,所以我会尽量使我的帖子清晰易读

在浏览某个网站的日志时,我遇到了一些黑客企图,我想在一个封闭的服务器上重新创建/测试。我制作了一个简单的PHP网页,它获取一个名为“id”的变量,并且在查询中不进行任何过滤/验证

相关PHP代码

$var = $_GET['id'];

echo $_GET['id'] . "<br>\n";

include ( "/var/www/dbconnect.php" );
$mysqli = new mysqli ( $db_host, $db_user, $db_password, "news" );
if ( $mysqli->connect_errno ) { echo "Failed to connect to MySQL: (" . $mysqli-   >connect_errno . ") " . $mysqli->connect_error; }

$query = "SELECT id, date, subject FROM news_table WHERE id=" . $var;
//$query = "SELECT id, date, subject FROM news_table WHERE id=250; DROP TABLE test;"; // This won't work because in PHP's implementation multiple statements are not allowed
if ( ! $result = $mysqli->query ( $query ) ) { echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error; } else { }
得到这个结果:

 CALL failed: (1222) The used SELECT statements have a different number
of columns
黑客花了5分钟发送了许多组合,试图侵入我们的生产服务器。我的生产服务器不会像上面的错误那样给出任何成功/失败的指示

我的问题是:当列的数量不匹配时,上面的黑客可以工作吗?如果是,怎么做


tnx

如评论中所述,不要这样做

不过,为了回答您的问题,
union
在注入中很有用,因为它允许您在输出中使用不相关的表。您看到的错误是因为原始数据库查询需要特定数量和类型的列,而注入的查询只需要一个列。在本例中,我们知道需要三列(来自代码),因此我们希望生成的SQL语句

SELECT id, date, subject FROM news_table WHERE id=3 union select 0, 0, unhex(hex(version())) --
(这可能不起作用,具体取决于您的数据类型和我的能力)


也可以使用mysql而不是mysqli,因为它更容易被注入

而不是试图理解
黑客行为
修复代码以防止它,不要像以前那样使用SQL,使用bindersBTW:你的问题似乎更关心的是如何让黑客行为发挥作用,而不是修复它,你是在试图攻击别人吗?:]黑客失败的事实反映在我们良好的编码实践中。该页需要一个整数,但没有得到它。检测并对情况作出反应是解决办法。我们知道修复,但我们不知道的是黑客试图做什么。。。现在我知道你说的是错的,他不能让它工作的事实不是因为“整数”,而是因为他没有花足够的时间给你造成伤害,或者他做了,你只是没有看到他的成功。他不能进去的事实是因为我们验证和净化了一切,我们的代码是好的。我们定期进行法医和事故报告评估,我相信他/她失败了。我并不是说不可能对有问题的服务器进行黑客攻击。我想说的是,我们正试图领先潜在问题一步。这是可行的。为了更好地理解正在发生的事情,你必须能够理解黑客试图做什么。如果我违反了一些规则,我道歉。我通过观看David Hoelzer关于一个不相关主题(堆栈溢出)的SANS视频而变得感兴趣。我太老了,不适合做黑客:)黑客可能出于同样的好奇而四处窥探,而不是试图造成伤害。但这永远不能保证。我强烈建议您切换到PDO数据库扩展。参数化的查询使得进行这种攻击变得不可能。史蒂夫,我认为黑客试图找到一种进入系统的方法,还有什么可以呢?我可以用那个网站的日志写一本书。那个服务器是超级偏执狂,一切都被记录了。。。例如,每一次黑客尝试都有详细的记录,比如在本例中,mysql被弃用为PHPV5.5.0。我遗漏了什么吗?不,你没有遗漏什么,mysql在较新的版本中被贬低,因为它更倾向于sql注入
SELECT id, date, subject FROM news_table WHERE id=3 union select 0, 0, unhex(hex(version())) --
SELECT id, 
       date, 
       subject 
FROM   news_table 
WHERE  id = 3 
UNION 
SELECT NULL                  AS id, 
       NULL                  AS date, 
       Unhex(Hex(Version())) AS subject