2010-10-28 86 views
8

浏览过的网页的更可疑的部分的说明,我碰巧遇到这一特定的SQL注入:特别是SQL注入

http://server/path/page.php?id=1+union+select+0,1,concat_ws(user(),0x3a,database(),0x3a,version()),3,4,5,6--

我的SQL知识 - 我认为是像样的 - 似乎当我读到这个时非常有限。

由于我为网络开发的广泛,我很好奇,看看这段代码实际上做什么,更重要的是它如何它的工作原理。

回答

8

它取代了这样一个不恰当的书面查询参数化:

$sql = ' 
SELECT * 
FROM products 
WHERE id = ' . $_GET['id']; 

与此查询:

SELECT * 
FROM products 
WHERE id = 1 
UNION ALL 
select 0,1,concat_ws(user(),0x3A,database(),0x3A,version()),3,4,5,6 

,它为您提供有关连接数据库的名称,版本和用户名信息。

+2

只是一个注释:0x3A是一个冒号(:)在十六进制 – 2010-10-28 12:29:44

+0

+1:还请注意,它并不真正代替'?'作为占位符 - 如果是的话,它不会是注入!它在将*解释为SQL之前将其替换为文本*;这是SQL注入攻击的全部本质。 – 2010-10-28 12:44:06

+0

@Donal:在答案中更清楚。 – Quassnoi 2010-10-28 12:46:43

0

看来,以获取用于连接到数据库,该数据库ADRESS和端口,它的版本的用户。它会被错误信息放置。

1

此代码添加一个额外的联合查询到正在上page.php文件执行SELECT语句。注入器已确定原始查询有6个字段,因此选择数值(列数必须与联合相匹配)。在CONCAT_WS只是让一个字段与数据库用户,数据库,和版本,用冒号分隔的值。

4

注射结果依赖于关于底层查询语法一些假设。

正在这里假设是什么,有一个查询某处将采取“ID”参数,直接代入查询的代码,也懒得清理它。

这是假设的东西像一个天真的查询语法:

select * from records where id = {id param} 

这样做是什么的结果取代查询(在上面的例子中):

select * from records where id = 1 union select 0, 1 , concat_ws(user(),0x3a,database(),0x3a,version()), 3, 4, 5, 6 -- 

现在,这是什么呢这很有用的是,它不仅可以抓取程序感兴趣的记录,还可以将它与一个告诉攻击者的假数据集联合起来(这些值在第三列中用冒号分隔):

  • 与我们 连接到数据库
  • 数据库
  • 数据库软件的版本名称的用户名

您可以通过简单地运行得到相同的信息:

select concat_ws(user(),0x3a,database(),0x3a,version()) 

直接在sql提示符下,你会得到类似于:

joe:production_db:mysql v. whatever 

此外,由于UNION执行隐式排序,并且假数据集中的第一列以0开始,因此您的伪造结果将位于列表顶部的机会相当不错。这很重要,因为程序可能只使用第一个结果,或者在上面给出的基本表达式中有一点额外的SQL,将结果集限制为一条记录。

存在上述噪音的原因(例如,select 0,1,...等)是为了使其工作,您调用UNION的语句必须具有与第一个结果集。因此,只有相应的记录表有7列时,上述注入攻击才有效。否则,你会得到一个语法错误,这种攻击不会真的给你想要的。双破折号( - )只是为了确保在替换中可能发生的后缀被忽略,并且我得到了我想要的结果。 0x3a垃圾只是说“用冒号分隔我的值”。

现在,让这个查询作为一个攻击媒介很有用的是,如果表中有多于或少于7列的话,它很容易被手动重写。

例如,如果上面的查询没有工作,和有问题的表有5列,经过一番试验我会打在下面的查询网址为注射载体使用:

http://server/path/page.php?id=1+union+select+0,1,concat_ws(user(),0x3a,database(),0x3a,version()),3,4-- 

的攻击者猜测的列数可能是基于对页面有教育的看法。例如,如果你正在寻找列出所有的装饰物在商店的页面时,它看起来像:

Name  |  Type  |  Manufacturer 
Doodad Foo Shiny    Shiny Co. 
Doodad Bar Flat     Simple Doodads, Inc. 

这是一个相当不错的猜测,你看这个表有4列(记得有最如果我们通过'id'参数进行搜索,可能会隐藏某处的主键)。

对不起,我希望能回答你的问题。

+0

+1 - 很好解释 – Nivas 2010-10-28 13:09:01