我们熟知关于update注入最常用的就是报错,然而针对有回显的情况还可以有以下小技巧。
0x01 Mysql特性
Mysql中update语句的定义如下:
UPDATE table_name SET field1 = new-value1, field2 = new-value2 [WHERE Clause]
但是偶然发现,field1与field2两字段可以同名,并且UPDATE之后的字段内容会以field2的赋值为准。
如上图中,Link字段被赋值了两次,最终的该Link字段的内容以最后一次赋值123为准,那么我们就控制了这个字段的显示,从而便可以利用这点完成注入。
0x02 科威盒子1.7注入漏洞
这里举个小示例,漏洞触发点在`member/add.php`处,
elseif( $type == "editok" )
{
$id = intval($_POST['id']);
$Name = _T($_POST['Name']);
$Link = $_POST['Link'];
$Order = intval($_POST['Order']) ? intval($_POST['Order']) : '0';
$db -> query("UPDATE `".$dbprefix."_favorite` SET
`Name` = '{$Name}',
`Link` = '{$Link}',
`Order` = '{$Order}'
WHERE `ID` ={$id}");
......
}
其中的$Link变量并没有进行过滤直接带到Update过程中,并考虑到多行Update语句,因此在Link处构造payload:
1',Link=(select user()),#
注入完成。
再次修改时,发现此时已经返回了字段内容。