联合查询注入
报错型注入
布尔盲注
时间盲注
二次注入
宽字节注入
堆叠注入
HTTP头部注入
在单引号字符型注入的前提下,如果是整型注入,则把单引号和注释符(--+)去掉,若是双引号注入则把单引号换成双引号。
使用场景
页面上有显示位
什么是显示位:在一个网页正常页面,服务端执行SQL语句查询数据库中的数据库,客户端将数据展示在页面中,这个展示数据的位置就叫显示位。
注意
要求多条查询语句的查询列数是一致的
关键字默认去重,如果使用l可以包含重复项
在查询注入中,可以先用或者是将多列结果拼接为一列,再使用将多行结果在一行输出
payload
判断是否存在注入,判断注入点类型:
(整型)
(整型)
(字符型)
(字符型)
判断当前数据表中有几列
查询显示位在第几列(假设一共3列):
注意:这里必须是查询一个不存在的记录才能起作用
显示当前数据库(假设显示位包含第三位):
查看当前数据库中的所有表:
函数把所有结果都在一行输出
查询所有数据库:
查询某个数据库中的表
查询某个表中的所有字段:
查询某个表中的字段内容
使用场景
页面上没有显示位但是有sql语句执行错误信息输出
payload
主要有3种SQL注入报错方式:
它接收两个字符串参数,之一个参数可以传入目标xml文档,第二个参数是用Xpath路径表示法表示的查找路径。这里如果Xpath格式语法书写错误的话,就会报错。
这里就是利用这个特性来获得我们想要知道的内容。
mysql> select ExtractValue('<a><b><b/></a>', '~');
ERROR 1105 (HY000): XPATH syntax error: '~'
利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出
mysql> select ExtractValue('<a><b><b/></a>', concat('~', (select database())));
?
ERROR 1105 (HY000): XPATH syntax error: '~security'
xml_target:需要操作的xml片段
xpath_expr:需要更新的xml路径(Xpath格式)
new_xml:更新后的内容
不过这些参数都不太重要,这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容:
mysql> select updatexml('test', concat('~', (select database())), 'test');
?
ERROR 1105 (HY000): XPATH syntax error: '~security'
?
?
mysql> select updatexml('test', concat('~', (select version())), 'test');
?
ERROR 1105 (HY000): XPATH syntax error: '~5.7.27-0ubuntu0.18.0.1'
和类似,它们的第二个参数使用Xpath路径法表示的查找路径。这里如果Xpath格式语法书写错误的话,就会报错。利用函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
和函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容。利用函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。
floor()报错注入的原因是group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或函数执行后的结果。
其他的报错函数:
报错的原理:
exp是一个数学函数,取e的x次方,当我们输入的值大于709就会报错。然后~取反它的值总会大于709,所以报错。
在报错注入中,查询字段的内容,不能用group_concat将所有结果都在一行输出,会出现子查询多于1列的情况。可以直接查询字段名,后面使用limit x,1来显示第x条记录。当需要查询多列内容时,可以使用concat或者是concat_ws拼接不同列的结果字符串,再在后面使用limit x,1来显示第x条记录。
通过或者报错,对输出字符有长度限制,最长为32位。这里可以用分割函数分割出来:
起始位置从1开始,之一个参数可以为sql语句
起始位置是从1开始的,之一个参数可以为sql语句
得到字符串左部指定个数的字符
(1) ,查看数据库名之一位,,查看数据库名前二位。
(2) 同样的string可以为自行构造的sql语句
使用场景
页面没有显示位,也没有SQL语句执行错误信息,只能通过页面返回是否正常来判断注入点
payload
数据库名相关
查询数据库个数
查询某一个数据库名长度
查询某个数据库名
数据表
查询表的个数
查询某个表名的长度
查看某个表名
字段相关
查看某个表中的字段个数
查看某个表中字段名长度
查看某个字段名
记录内容相关
查看表中行数
查看某个字段内容的长度
查看某个字段的内容
布尔盲注有四个步骤,数据库名相关,数据表,字段相关,记录内容相关。在每个步骤中,需要获取3个基本信息。使用count()查询记录的个数,使用length()和limit x,1查询某条记录的长度。使用limit x,1, substr(), ascii()来查询某条记录的内容。limit x,1的作用是指定一条记录,substr()的作用是截取指定记录的一个字符,ascii()的作用是将截取的字符转换为ascii码,与具体的数值进行比较,从而获取指定记录中某一位具体的字符。
Sql注入截取字符串常用函数
sqlmap中用于布尔盲注
:返回字符串首字符的ASCII码值
:返回字符串从start开始长度为length的字符串。
:如果string1是NULL则返回string2,如果不是NULL返回string1。
: 用于数据类型转换,将volume转换成type类型(如这里是将数字转换为字符串)
: 统计个数
: 标记只要不同(唯一)的值
使用场景
页面上没有显示位,也没有输出SQL语句执行错误信息。正确的SQL语句和错误的SQL语句返回页面都一样,但是加入sleep(5)条件之后,如果if条件成立则页面返回速度明显慢了5秒。
常用函数
时间盲注也叫延时注入,一般会用到函数, , 还可以使用笛卡尔积
条件判断函数
当expre1为true时,返回expre2。为false时,返回expre3。
分割函数
一般喜欢把分割函数进行编码,编码的好处是可以不使用引号。常用的编码函数有
payload
与布尔盲注的思想类似。
如果使用=比较,当expre1为true时,返回sleep(5),否则返回1。因为=只能有一个值满足条件。
1.判断数据库的个数
?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+
?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+
2.判断数据库名的长度
id=1' and if((select length(schema_name) from information_schema.schemata)=9, sleep(5), 1) --+
3.查询数据库名
id=1' and if((select ascii(substr((select schema_name from information_schema.schemata limit 0,1)1,1)))=105, sleep(5), 1) --+
什么是二次注入
二次注入是指已存储(比如存储在数据库、文件中)的用户输入被读取后,再次进入到SQL查询语句中导致的注入。
原理
有些网站当用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据 *** 入到数据库中被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询,如果此时没有对读取出的数据进行转义处理,就发生了SQL二次注入。
注意:可能每一次注入都不构成漏洞,但是如果一起使用就可能造成注入
所以,二次注入的防范方式,不仅需要在向数据库插入数据时对特殊字符进行转义,当从数据库中读取数据进行查询的时候,也需要对特殊字符进行转义。
原理介绍
MySQL 的命令行中,每一条语句以结尾,这代表语句的结束,如果在注入过程中在后面添加要执行的 SQL 语句的话,这种注入方式就叫做堆叠注入 (stacked injection) 。
与 union select 联合查询相比,堆叠查询更加灵活,可以执行任意的 SQL 语句。
局限性
并不是每一个环境下都可以执行,可能受到 API 或者数据库引擎限制。
在 Web 中代码通常只返回一个查询结果,因此,堆叠注入第 二个语句产生错误或者结果只能被忽略
这个就是为什么我们尝试用 union select 联合查询的原因,使用堆叠注入前,我们还需要了解数据库的相关信息才可以,如表名、列名等。
产生原因
函数用于执行一个 SQL 语句,或者多个使用分号分隔的 SQL 语句。这个就是堆叠注入产生的原因,因为本身就支持多个 SQL 语句。
利用方式
DNSLog数据外带
需要条件:MySQL开启、DNSLog平台、Windows平台
Dnslog在SQL注入中的实战
开启日志getshell
需要条件:Web的绝对路径、MySQL可读写Web。
因为在Linux下权限控制更严格,所以这种方式在Windows下更容易成功。
Less-38 开启日志 Getshell
宽字节注入
以下是常用的URL编码
ASCII值 | URL编码 |
---|---|
\ | %5C |
' | %27 |
" | %22 |
# | %23 |
& | %26 |
宽字节注入的利用条件
查询参数是被单引号包围的,传入的单引号又被转义符转义,如在后台数据库中对接收的参数使用、或者是其他转义函数
数据库的编码为GBK
概括的说,就是单引号被转义,但编码为GBK。
利用方式
GET形式
在上述条件下,单引号被转义为,即。如果我们在单引号前加上,就会构成,而在GBK编码方式下,是汉字"連",所以单引号成功逃逸。
如果是在请求体中,需要使用POST参数。使用Burp Suite抓取请求,然后在单引号()之前添加。
宽字节注入原理
MySQL在使用GBK编码时,会认为两个字符为一个汉字,例如就是一个汉字。因为转义 *** 主要就是在敏感字符前面添加反斜杠,所以这里想办法去掉反斜杠即可。
吃掉
其实这里之一个字符并不局限为,只要是在到范围内都可以。具体原因是,,我们在前面添加,形成,MySQL在GBK编码方式的时候,会将两个字节当做一个汉字,这个时候就把当做是一个汉字,则作为一个单独的符号在外面,同时也就达到了我们的目的。
将中的过滤掉
例如可以构造的情况,后面的会被前面的给注释掉。这也是bypass的一种 *** 。
函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符 | 转义后 |
---|---|
该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
在使用时,我们需要将设置为的方式,才能够防御此漏洞。
什么是HTTP头注入
Web应用程序中把用户提交的参数未做过滤就直接输出到HTTP响应头中,攻击者可以利用该漏洞来注入HTTP响应头。
概括的说,就是注入点在HTTP响应头中。
常见的HTTP可能存在注入点的参数
:浏览器版本
: 网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据
:获取HTTP请求端真实IP
: 获取IP
:浏览器向Web服务器表名自己是从哪个页面链接过来的
:访问的Web服务器的域名/IP和端口号
造成HTTP头注入的原因
在网站代码中,,,,等字段与数据库有交互
代码中使用了php超全局变量
如何防御
在设置HTTP响应头的代码中,过滤回车换行()字符
不采用有漏洞版本的Apache服务器
对参数的合法性校验以及长度限制,谨慎的使用用户传入的参数作为HTTP返回包的header设置。
近日一则特斯拉系统宕机车主被困沙漠的消息引起了大家的关注,而且车主也是打了将近两小时的紧急道路救援电话也是无人接听,这样的结果也是让车主感到非常的不满,另外据最新消息报道特斯拉起诉特朗普政府,这又是怎...
又到一周星期五,周末应该去哪里玩呢?椰泰君在这里已经为你准备好一份旅游攻略,相信总一处合适你!再偷偷告诉你文末还有惊喜礼包哦! 奥地利风情 惠州哈斯塔特村 小镇设计全部以奥地利古典音乐为...
什么是轻声(哪些词语要读轻声)轻声是一种变调的语音现象,一定体现在词语和句子中,轻声音节的读音不能独立存在。 一、轻声的作用: 1、轻声对某些词有区别词义的作用。 如兄弟 xiōnɡ di(指弟...
相信现在有很多的朋友们对于农村房产证能代款吗 农村房产证可以贷款吗都想要了解吧,那么今天小编就来给大家针对农村房产证能代款吗 农村房产证可以贷款吗进行一个介绍吧,希望小编介绍的内容能够为大家起到帮助哦...
本文导读目录: 1、QQ会员有一个24小时在线功能,收费吗? 2、移动QQ设置了24小时在线是免费的吗? 3、如何用手机让QQ免费24小时在线 4、现在QQ还有24小时在线这个业务吗?...
药房工作制度(关于各种药房管理制度范本) 药房工作制度 一、调剂室工作制度 1.收方后应对处方内容、病员姓名、年龄、药品名称、剂量、剂型、服用方法、禁忌等,详加审查后方能调配; 2.配方时...