简单总结Web安全面试中的基础知识
0x01 前言
网络和Github上有很多安全相关的面试经验,但部分考点并没有参考的答题思路和解析,本人根据自己的面试经验和知识,对网络资料和自己遇到的题目进行整理。如有不足,请多指正。
0x02 Web安全基础知识点
SQL注入
原理
SQL注入的形成通常是因为未检测或未充分检测用户的输入部分,导致被黑客构造输入对代码进行截断然后执行自己的SQL指令,对数据库敏感数据进行查询。
注入的类型
- 布尔型注入
- 报错型注入
- 可联合查询注入
- 基于时间延迟的注入
布尔型注入
布尔型注入是通过判断页面的返回情况来获得信息。
利用案例:xxx/view?id=1 and substring(version(),1,1)=5
如果服务端MySQL版本是5.X的话,那么页面返回的内容就会跟正常请求一样。攻击者就可以通过这种方式获取到MySQL的各类信息。
报错型注入
根据页面的报错获得信息。
构造非法的SQL指令,根据页面返回的报错进行调试。
可联合查询的注入
指的是可以使用UNION情况的注入,可以直接构造多条联合指令。
基于时间延迟的注入
条件语句查看时间延迟来判断语句是否执行(即页面返回时间是否增加)。
宽字节注入
由于数据库使用GBK编码,网站使用utf-8编码,payload%df%27
绕过WAF的思路
通过注释绕过:添加/**/来绕过关键字拦截
空白字符:部分字符在SQL里是空白字符,可以用其替代sql语句中的空格(+,-,~,!,``,.1)
1
2
3
4
5SQLite3 0A 0D 0C 09 20
MySQL5 09 0A 0B 0C 0D A0 20
PosgresSQL 0A 0D 0C 09 20
Oracle 11g 00 0A 0D 0C 09 20
MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20使用SQL内置函数或者关键字
%0a换行
防御SQL注入
- 过滤输入
- 规范编码
- 关闭框架debug
sqlmap的利用
1 | -u 单个URL -m xx.txt 多个URL |
XSS
XSS类型
- 反射型XSS:你发送一次带XSS代码的请求,只能在当前返回的数据包中发现XSS代码;(直接在输入的位置使用
<?php echo xxx?>
) - 存储型XSS:你发送一次带XSS代码的请求,以后这个页面的返回包里都会有XSS代码;(将xss攻击代码写入数据库,每次访问都会执行)
- DOM型XSS:你发送一次带XSS代码的请求,在返回包里压根儿就找不到XSS代码的影子;(常用的alert)
CSRF
简介
对于 CSRF,其两个关键点是跨站点的请求与请求的伪造,由于目标站无 token 或 referer 防御,导致用户的敏感操作的每一个参数都可以被攻击者获知,攻击者即可以伪造一个完全一样的请求以用户的身份达到恶意目的。
攻击方式
利用 HTML 元素发出 CSRF 请求,这是最常见的 CSRF 攻击。HTML 中能设置 src/href
等链接地址的标签都可以发起一个 GET 请求,如:
1 | <link href=""> |
还有 CSS 样式中的:
1 | @import "" |
也可使用表单来对 POST 型的请求进行伪造。
1 | <form action="http://www.a.com/register" id="register" method="post"> |
同源策略
定义
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
规避同源策略
- JSONP的劫持
- CORS(跨源资源分享)
防御方式
- 加验证码(强制交互)
- 验证来源Referer(策略要严谨,也要防止空Referer)
- 使用随机token(表单一旦提交,token销毁)
SSRF
原理
利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务。
伪协议
- 利用
file
协议读取本地文件 - 利用
dict
协议查看端口 - 利用
gopher
协议攻击redis反弹shell
文件包含漏洞
PHP文件包含函数
include()
:使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。inclue_once()
:功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。require()
:使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并立即终止程序。require_once()
:功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
利用思路
- 本地文件包含:在log中插入执行代码,文件包含时即执行
- 远程文静包含:由于在
php.ini
中开启allow_url_include
、allow_url_fopen
选项。开启后可以直接执行任意代码。可以利用该漏洞远程包含shell等。
文件上传漏洞
解析漏洞
IIS 解析漏洞
IIS6.0 在解析文件时存在以下两个解析漏洞 。
当建立 .asa 、.asp 格式的文件夹时 , 其目录下的任意文件豆浆被 IIS 当作 asp 文件 来解析 .
在 IIS6.0 下 , 分 号 后面 的 扩 展 名 不 会 被 解 析 , 也 就 是 说 当 文 件 为 *.asp;.jpg时,IIS6.0 同样会以 ASP脚本来执行 。
Apache 解析漏洞
在 Apache 1.x 和 Apache 2.x 中存在解析漏洞 , 但他们与 IIS 解析漏洞不同。
Apache 在解析文件时有一个规则 : 当碰到不认识的扩展名时 , 将会从后向前解析 , 直到 碰到认识的扩展名位置 , 如果都不认识 , 则会暴露其源码 . 比如 :
php.rar.xx.aa
Apache 首先会解析 aa 扩展名 , 如果不认识则接着解析 xx 扩展名 , 这样一直遍历到认识 的扩展名为止 , 然后再将其进行解析 .
PHP CGI 解析漏洞
在 PHP的配置文件中有一个关键的选项 : cgi.fi: x_pathinfo. 这个选项在某些版本是默认开启的 , 在开启时访问 url, 比如 :http://www.xxx.com/x.txt/x.php,x.php 是不存在的 文件 , 所以 php 将会向前递归解析 , 于是就造成了解析漏洞 . 由于这种漏洞常见于 IIS7.0 、 IIS7.5 、 Nginx 等 Web服务器 , 所以经常会被误认为是这些 Web服务器的解析漏洞 。
Nginx <8.03 空字节代码执行漏洞
影响版本 :0.5,0.6,0.7<=0.7.65 0.8<=0.8.37
Nginx 在图片中嵌入 PHP代码 , 然后通过访问 xxx.jpg%00.php 可以执行其中的代码 。
其他
在 windows 环境下, xx.jpg[ 空格 ] 或 xx.jpg. 这两类文件都是不允许存在的 , 若这样命 名,windows 会默认除去空格或点 , 攻击者可以通过抓包 , 在文件名后加一个空格或者点绕过 黑名单 . 若上传成功 , 空格和点都会被 windows 自动消除 , 这样也可以 getshell。
如果在 Apache 中 .htaccess 可被执行 . 且可被上传 . 那可以尝试在 .htaccess 中写入 :
SetHandlerapplication/x-httpd-php
然后再上传名称为 shell.jpg 的 webshell, 这样 shell.jpg 就可解析为 php 文件 。
0x03 一些面试问答
@eval的@什么意思
@符号可以在任何表达式前面使用,即任何有值或者可以计算出值的表达式之前,用于忽略错误和警告信息。
sqlmap中os-shell和web-shell的区别
os-shell是将脚本插入到数据库中,然后生成相应的代码文件,获取shell即可执行命令。web-shell是单纯的动态脚本执行文件。
解释一下location.hash
一般情况下为URL后 “#” 及其后面一部分组成,如http://www.test.com/#/something,其中http://www.test.com为真实的路径,而#/something则为网页中的位置,称之为**锚点**。由于location.hash是可读可写的,当hash值改变时,触发onhashchange事件。location.hash与HTML5 history类似,都能够在改变页面的URL而不会引起浏览器的重载。但是location.hash支持比较早的浏览器,而history是在HTML5的新API,可能某些较早的浏览器不支持
0x04 参考资料
**注释:部分内容直接copy,如有侵权请联系删除