WHCSRL 技术网

OWASP之注入_tian

注入漏洞产生的原因:

可控变量,带入数据库查询,变量未存在过滤或过滤不严谨。

怎么挖掘:
通过输入sql语句,尝试输入,然后发现页面的回显。

怎么利用:
确认有漏洞之后,通过sql语句获得数据库的版本,数据库的用户名,库名,表名,字段名,最后获得数据。

难点:
1.如何去判断一个网站是否存在注入漏洞,什么反应又代表不存在漏洞?
2.在网站配备了防火墙的情况下,怎么绕过?方法是什么?

注入流程:
1.判断注入
2.猜解列名数量(字段数) order by 用枚举法,试出错误与正常的临界值 ,假如判断出字段数量为4,则查询语句:union select 1,2,3,4
3.判断出存在注入之后就可以进行下一步,信息收集
收集:
数据库版本 version()
数据库名字 database()
数据库用户 user()
操作系统 @@version_compile_os

在MYSQL5.0以上版本,mysql存在一个自带数据库名为information_schema,它是一个存储记录所有数据库名、表名、列名的数据库,也相当于可以通过查询它过去指定数据库下面的表名列名信息。

information_schema.tables 记录所有表名信息的表
information_schema.column 记录所有列名信息的表

注入出现无回显的情况,原因之一可能是sql语句查询方式的问题导致。
这个时候需要用相关的报错或盲注进行后续操作。

盲注
1.报错盲注 原理:利用mysql自身的bug,Bug 8652的主要内容就是在使用group by 对一些rand()函数进行操作时会返回duplicate key 错误
用到的函数:count()统计原组的个数,concat字符串连接,floor向下取整,rand()产生一个0-1的随机数
公式:
?id=1’ union select 1,count(*),concat(你希望的查询语句,floor(rand(0)*2))a from information_schema.columns group by a
用公式来猜解需要的数据库名表名字段名数据。

2.布尔盲注 原理:页面既不会回显数据,也不会回显错误信息,只返回“ture”或“false”
用到的函数:length() 返回字符串的长度、substr() 从特定位置开始的字符串返回一个给定长度的子字符串、ascii() 输出一个字符的ascii码值,如果是字符串则会处理第一个字符
判断数据库名的长度—>猜解数据库名—>猜解表名—>猜解字段—>猜解数据

3.延时盲注
使用的函数:if(x1,x2,x3)if函数的3个参数分别代表的含义,x1,sql语句判断,x2,判断为真时返回的值,x3,判断为假时返回的值
例子:if(left(user(),1)=‘a’,0,sleep(3))
这条语句的意思,判断用户名从左数第一个字符是否等于字符a,如判断为假,延时。
真实场景:if(ascii(substr(database(),1,1))>115,0,sleep(5))%%23

如果网站对所有输入的字符都做了限制,跑路吧,别浪费时间。

推荐阅读