SQL注入漏洞的奇数格式?

问题描述:

我一直在努力学习更多关于SQL注入攻击的知识。我理解这个原则,但是当我看到其中的一些攻击时,我不知道他们是如何在做他们正在做的事情。SQL注入漏洞的奇数格式?

经常会有不均匀的引号,并且通过十六进制字符混淆很多。

我没有得到十六进制字符......当然,它们被浏览器翻译回ASCII,所以有什么意义呢?

但是,我主要被奇怪的引用困惑。我现在很难找到一个例子,但是通常似乎引用会在声明结束之前的某个时刻结束,当时我会认为它会在最后?

也许一个例子是“1或1 = 1

什么这样的说法做共同使用?

+0

好问题。它很难过,看到我是唯一一个在SQL注入攻击中实际使用过这种技术的人。 – rook 2010-11-23 23:39:49

我没有得到个十六进制字符..., 他们肯定是由浏览器

都能跟得上翻译回 ASCII。

但是,我主要被 奇怪的引用困惑。我有问题 现在找到一个例子,但是 它通常似乎是 在 结束之前的某个点结束的声明,当我想 认为它会在最后?

想象一下,您正在构建内联SQL,而不是像您应该那样使用参数替换。我们将使用一种看起来很像PHP的虚构语言,因为没有特别的原因。

$sql = "delete from foo where bar = '" + $param + "'"; 

所以,现在,想象$param得到由浏览器设置等...

$param = "' or 1=1 --" 

(我们假装喜欢--是这里的SQL注释序列。如果不是有办法在那附近)

所以,现在,你的SQL在字符串替换完成后是什么?

delete from foo where bar = '' or 1=1 --' 

将删除foo中的每条记录。

这一直是有目的的简单,但它应该给你一个很好的想法,不平衡的报价是什么。

+1

@Rook - 大部分答案与十六进制编码无关。我刚刚纠正了他对浏览器的假设,并继续前进。另外,我没有看到他的问题是如何针对mysql的,所以你关于mysql_query的争论也是相当虚假的。 – Donnie 2010-11-24 00:21:47

+0

这并不回答这个问题,你应该阅读我发布的一个sql注入攻击。 – rook 2010-11-24 00:44:24

假设我们有一个表单,我们提交一个名称字段的表单。名称用于变量$ Name。然后运行该查询:

INSERT INTO Students VALUES ('$Name') 

它将被翻译成:

INSERT INTO Students VALUES ('Robert'); DROP TABLE STUDENTS; --') 

的 - 是一个注释分隔符。之后,一切都将被忽略。 '用于分隔字符串文字。

在攻击中使用十六进制字符有一些原因。其中一个是混淆,另一个是绕过一些天真的安全措施。

+0

现在,分组查询现在不被最普遍的sql服务器支持。另外 - 不是唯一的注释分隔符,例如MySQL有/ * ...使用十六进制编码很难进行混淆,因为您无法隐藏实际查询,只能查看其中的值。它主要用于因为没有必要使用单引号来表示加数值,所以当你注入复杂时,你不必担心引号的数量,并且可以计算注入查询的整个逻辑。 – 2010-11-23 22:40:39

+0

这是SQL注入的SQL Server示例。这将永远不会与`mysq_query()`一起工作,并且它不会处理十六进制编码。 – rook 2010-11-23 23:23:32

至于引用不齐;发生sql注入其中,编码器没有过滤用户输入的危险字符,如单引号 - 考虑下面的语句

SELECT * FROM admin WHERE username='$_GET["user"]' and password='$_GET["pass"]' 

,如果我知道,有效的用户名为admin,并插入'or 1=1我会得到以下

SELECT * FROM admin WHERE username='admin' and password='something' or 1=1 

这将导致查询总是返回true,因为无论密码的值如何,表达式的左侧都将始终为true。

这是sql注入的最简单的例子,你会发现攻击者根本不需要使用引号,或者可以使用注释分隔符(例如--/*)将其余的查询注释掉,如果在注入点之后有更多参数通过。

至于十六进制编码,可能有几个原因,避免过滤,使用十六进制编码值更简单,因为您不必担心引用查询中的所有值。 例如,这是有用的,如果你想使用concat共同谱写两场在一起,就像这样:

inject.php?id=1 and 1=0 union select 1,2,concat(username,0x3a3a,password) from admin 

这将提供第三排是可见的一个,换来isntance admin::admin。如果我没有使用十六进制编码,我会做到这一点:

inject.php?id=1 and 1=0 union select 1,2,concat(username,'::',password) from admin 

这可能是与上述addslashes功能的问题,也有写得不好的正则表达式的消毒功能,或者如果你有非常复杂的查询。

Sql注入是非常广泛的话题,我已经涵盖甚至几乎没有通过介绍。

有些情况下,sql注入禁止引用标记。在这种情况下,攻击者必须使用编码方法,例如对他的字符串进行十六进制编码。例如'/etc/passwd'可以写成0x2f6574632f706173737764,它不需要引号。以下是禁止引用标记的易受攻击查询的示例。 :

mysql_query("select name from users where id=".addslashes($_GET[id]));

如果你想使用MySQL之类的函数load_file(),那么你必须要使用十六进制编码。

的PoC:/vuln.php?id=1 union select load_file(0x2f6574632f706173737764)

在这种情况下,/ etc/passwd文件被读出,也将是第二排。

下面是我在我的MySQL SQL注入的攻击使用十六进制编码功能的变化:

function charEncode($string){ 
    $char="char("; 
    $size=strlen($string); 
    for($x=0;$x<$size;$x++){ 
     $char.=ord($string[$x]).","; 
    } 
    $char[strlen($char)-1]=")%00"; 
    return $char; 
} 

我用这个确切的方法exploiting HLStats 1.35。我还在我的php nuke exploit中使用了此功能,以绕过使用into outfile<?php?>写入磁盘的xss过滤器。其中重要的是要注意,into outfile是一个查询运算符,它不接受输出到函数或十六进制编码的字符串,它只接受带引号的字符串作为路径,因此在易受攻击的查询上面into outfile不能被攻击者使用。 load_file()是一个函数调用,可以使用十六进制编码。