SQL注入漏洞的奇数格式?
我一直在努力学习更多关于SQL注入攻击的知识。我理解这个原则,但是当我看到其中的一些攻击时,我不知道他们是如何在做他们正在做的事情。SQL注入漏洞的奇数格式?
经常会有不均匀的引号,并且通过十六进制字符混淆很多。
我没有得到十六进制字符......当然,它们被浏览器翻译回ASCII,所以有什么意义呢?
但是,我主要被奇怪的引用困惑。我现在很难找到一个例子,但是通常似乎引用会在声明结束之前的某个时刻结束,当时我会认为它会在最后?
也许一个例子是“1或1 = 1
什么这样的说法做共同使用?
我没有得到个十六进制字符..., 他们肯定是由浏览器
都能跟得上翻译回 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
中的每条记录。
这一直是有目的的简单,但它应该给你一个很好的想法,不平衡的报价是什么。
假设我们有一个表单,我们提交一个名称字段的表单。名称用于变量$ Name。然后运行该查询:
INSERT INTO Students VALUES ('$Name')
它将被翻译成:
INSERT INTO Students VALUES ('Robert'); DROP TABLE STUDENTS; --')
的 - 是一个注释分隔符。之后,一切都将被忽略。 '用于分隔字符串文字。
在攻击中使用十六进制字符有一些原因。其中一个是混淆,另一个是绕过一些天真的安全措施。
现在,分组查询现在不被最普遍的sql服务器支持。另外 - 不是唯一的注释分隔符,例如MySQL有/ * ...使用十六进制编码很难进行混淆,因为您无法隐藏实际查询,只能查看其中的值。它主要用于因为没有必要使用单引号来表示加数值,所以当你注入复杂时,你不必担心引号的数量,并且可以计算注入查询的整个逻辑。 – 2010-11-23 22:40:39
这是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()
是一个函数调用,可以使用十六进制编码。
好问题。它很难过,看到我是唯一一个在SQL注入攻击中实际使用过这种技术的人。 – rook 2010-11-23 23:39:49