今天给大家详细的总结一些SQL如何的常用原理,方法,和一些演示和工具的使用。
最新的OWASP Testing Guide 4.0把SQL注入分为以下三类:带内,带外,盲注,所以文章的大体思路也是这样子的。
一 带内注入
所谓带内注入就是提起数据会会使用相同的channel返回,所以这种注入如果攻击成功效果明显,直接会在网页上显示。当然首先你的构建一个正确的SQL语句。关于SQL语句的构造,不是本文讨论的内容,所以默认大家有这方面的基础。
接下来我们要明白如何测试,关于这个问题。我们首先回答web app什么时候和数据交互,因为那些地方才是我们测试的切入点。常见交互地点比如说,认证表单,搜索引擎,电商网站,http header,隐藏的域啊等。当然你可以用’或者:符号来进行初步的判定,但我相信,这样的漏洞很少了。毕竟开发者这点意识还是有的。你可能看到的是一个500或者自定义的错误表单。这个时候就要利别的技术。比如盲注等。
接下来我们看一下owwasp提供靶机的源代码,结合源代码的我们分析一下如何进行带内注入。
如你所见,不同的图,对应不同的难度。图一,直接没有过滤用户输入,直接拿来使用。图二,利用PHP的mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。图三,首先利用striplashes删除反斜杠,在进行转移。含义就是你可以利用反斜杠绕过图二的过滤。具体我们分别来看:
图一:输入 admin’ or ’ 1=1– 能够成功绕过
图二:绕过图二的防御可以利用编码 0x27单引号结合 0x27 union select 1,table_name from INFORMATION_SCHEMA.tables –。应为单引号过滤了,还有INFORMATION_SCHEMA是每个mysql默认数据库。
图三:利用上面的方法也可以绕过,但是由于is_numeric函数存在,必须把整个字符串转成十六进制码,注意空格也要转化,因为is_numeric只能过数字或者数字串。
有些过滤器试图过滤:SQL关键字,单引号空白符等是可以绕过的:
1 关键字大小写变种
2 不用空白符利用内联注释 union =union//=//un//ion//
3 url编码 Unicode编码
4 使用动态查询
5 使用空字节 用来避开原生输入过滤器
7 利用剥离后的表达式
8 利通截断
在实际测试中,识别数据库的类型很重要,常用的方法有
1 查看错误的返回
2 利用社会工程学
3 利用工具扫描 nmap -A
对于不用的测试点和数据库类型输入的数据类型也不一样的
1 MYSQL
a) 数字类型
还未完结。。。。。