Web安全攻防(简)学习笔记
Web安全攻防-学习笔记
本文属于一种总结性的学习笔记,内容许多都早先发布独立的文章,可以通过分类标签进行查看
信息收集
信息收集是渗透测试全过程的第一步,针对渗透目标进行最大程度的信息收集,遵随“知己知彼,百战不殆”的原则,先了解目标在利用目标。
收集域名信息
收集域名信息的种类包括:子域名收集、Whois注册信息、备案信息、敏感信息收集、敏感目录探测、端口信息探测、系统服务探测、Web指纹探测、CDN排查/真实IP……等。
子域名收集
子域名是所谓的二级域名,通常一个主站的防护是严格的,但同时也会存在更多的二级子域名且可能防护简单。
子域名的收集有很多种方法,最简单的是使用Google-Hack搜索语法发现子域名,更多的使用工具和脚本对子域名进行“字典爆破”。
子域名爆破工具
- SubDomainsBrute (Python开发,依赖:dnspython):采用字典爆破的方式,对目标域名的子域名二级进行字典爆破
- Layer子域名挖掘机:采用可视窗口的傻瓜式
搜索引擎子域名枚举
在Google搜索引擎中使用site:baidu.com
语法枚举子域名
法律关注
域名爆破属于法律灰色地带,如果域名官方明示“禁止扫描器”则需注意。
Whois信息/注册信息
Whois是一个标准的互联网协议,用来收集网络注册信息、注册域名、IP地址……
Whois有很多的线上平台:爱站、站长之家等
同时国内上线的网站和服务都会进行ICP备案,可以通过“beianbeian.com”查询备案的网站;国家规定备案编号要显示在页面上(普遍在页脚处)
敏感信息收集
敏感信息的收集通常是通过Google等众多搜索引擎发现。
敏感目录探测
[工具]
DirBuster:字典扫描探测目录
御剑目录扫描珍藏版:后台目录字典扫描
端口信息/服务信息探测
[工具]
Nmap:强大的扫描器,支持端口探测、服务探测
御剑高速端口扫描:利用端口尝试连接的端口探测
服务探测/Web指纹
[工具]
Nmap:一代神器
*san:针对特定的CMS扫描器(例如:WPscan)
[在线]
云悉WEB指纹:www.yunsee.cn
Wapplayzer(浏览器插件)
CDN的绕过和检验
[检验方法]
使用多地Ping验证IP段的方式来检验CDN
例如:www.17ce.com(在线多地区ping目标)
[绕过方法]
邮箱服务器IP(邮箱服务器不一定使用CDN)
其它同域站点(不一定对所有站点设置CDN)
境外访问(CDN的设置有针对)
查看历年的域名解析记录
SqlMap的简单运用
Burp的简单运用
Nmap的简单运用
SQL注入简要认识
SQL注入过程知识的摘要
SQL注入行为剖析
UNION联合注入(回显)
[注入点]
www.xx.com/?id=1 and '1'='1 (字符型注入)
[源码SQL拼接]
+----+------+------+
| id | name | pass |
+----+------+------+
| 1 | admin| 1234 |
+----+------+------+
| 2 | root | root |
+----+------+------+
select * form users where id='$id';
[union联合注入]
www.xx.com/?id=1 order by 1,2,3 => 判断字段数
www.xx.com/?id=1 union select 1,2,3 => union联合注入
www.xx.com/?id=1 union select 1,database(),3
boolean布尔注入(回显)
通过一些sql函数返回的布尔值进行判断枚举
[注入点]
www.xx.com/?id=1 and '1'='1 (字符型注入)
[源码SQL拼接]
+----+------+------+
| id | name | pass |
+----+------+------+
| 1 | admin| 1234 |
+----+------+------+
| 2 | root | root |
+----+------+------+
select * form users where id='$id';
[布尔注入举例]
1' and substr(database(),1,1)='t'
报错注入
[updatexml()报错注入]
1' and updatexml(1,concat(0x7e,(select user()),0x7e),3)
时间注入(盲注)
时间注入的逻辑是通过逻辑与非的方式设置一个时间函数(延迟函数)通过观察页面的响应来确定是否构成正确的语句.
简单而言,就是在页面无回显的情况下利用时间延迟的方式佐证布尔逻辑是否成立.
[函数学习]
sleep():时间延迟/等待函数
if('条件','成立','不成立')
benchmark():
[sleep时间盲注]
1' and if(substr(database(),1,1)='t',sleep(5),1)
堆叠查询注入
堆叠查询可以执行多条SQL语句以分号分隔,堆叠注入利用该特点,在第二个SQL语句中构造自己要执行的语句;当第一条执行失败,就会执行第二个堆叠的语句进行查询。
'; select databases()
二次注入
宽字节注入
COOKIE注入
在URL中没有发现参数,Cookie中存在ID=1;类推
[Cookie注入的PHP复现]
$id = $_COOKIE['id'];
$value = '1';
setcookie("id","$value")
$conn = mysqli_connect("localhost","root","root","test");
if(mysqli_connect_error()){
echo "连接失败" . mysqli_error($con) ;
}
$result = mysqli_query($conn,"select * from users where id=$id ");
if(!$result){
print("Error:%s\n",mysqli_error($conn));
exit();
}
$row = mysqli_fetch_array($result);
echo $row{'name'} ."+". $row{'pass'};
echo "<br>";
Base64注入
ID参数经过Base64编码,在后台被解析。
[Base64注入的PHP复现]
//调用base64_decode()对参数进行base64解码
$id = base64_decode($_GET['id']);
$conn = mysqli_connect("localhost","root","root","test");
$sql = "select * from users where id=$id";
$result = mysqli_query($sql);
$row = mysqli_fetch_array($result);
echo $row{'name'} ."+". $row{'pass'};
echo "<br>";
XFF注入攻击
HTTP数据包中有一个“X-Forwarded-for”头部参数简称XFF头;它代表客户端真实的IP,可以通过伪造XFF头来伪造IP。
xff: 127.0.0.1 'union select 1,2,3 --+
[XFF注入PHP复现]
getenv():获取一个环境变量的值
$conn = mysqli_connect("localhost","root","root","test");
if(mysqli_connect_error()){
echo "连接失败" . mysqli_error($con) ;
}
if(getenv("HTTP_CLIENT_IP")){
$ip = getenv("HTTP_CLIENT_IP");
} else if(getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else if(getenv("REMOTE_ADDR")){
$ip = getenv("REMOTE_ADDR");
} else {
$ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
$result = mysqli_query($conn,"select * from users where ip=$ip ");
$row = mysqli_fetch_array($result);
echo $row{'name'} ."+". $row{'pass'};
echo "<br>";
SQL注入绕过
大小写绕过
web应用对用户输入提交的内容进行敏感关键字扫描一旦符合则拦截当前的用户行为请求;往往在后台的黑名单中会忽视大小写问题,而sql是不区分大小写的。
安全建议:将用户输入的内容统一大小写进行关键字比对(不改变原来的字符串内容)
双写绕过
当web应用对敏感关键字进行拦截删除,将敏感关键字从字符串中删除;攻击者构造类似“uniunionon”这样的字符串,经过敏感关键字删除后就会变成“union”,这样子就会绕过了。
安全建议:采用多重的敏感关键字拦截,或者说对发现存在敏感字的请求全部拦截取消当前的访问。
全编码绕过注入
由于系统会自动对URL进行一次URL解码,所以只进行一次URL编码是不会有作用的,需要进行两次URL编码。
内联注释绕过注入
id=-1'/!UnIoN/ SeLeCT 1,2,concat(/!table_name/) FrOM /information_schema/.tables /!WHERE //!TaBlE_ScHeMa/ like database()#
绕过注释符号注入
id=1' union select 1,2,3||'1
最后的or '1闭合查询语句的最后的单引号,或者:
id=1' union select 1,2,'3
注释/括号绕过注入
使用‘/**/’代替空格或使用圆括号组合
十六进制绕过注入
使用十六进制的方式编码转换引号和括号或其他符号
绕过逗号注入
使用from、join、like、offset
[from]
select substr(database() from 1 for 1);
select mid(database() from 1 for 1);
[join]
union select 1,2 <==> union select * from (select 1)a join (select 2)b
XSS跨站脚本攻击
CSRF跨站请求伪造
合法的使用A用户进行登录等操作,利用CSRF漏洞伪造成B用户执行权限操作。
SSRF服务器请求伪造
SSRF由攻击者构造请求并由服务器发起,SSRF的目的是外网无法访问的内部系统(因为内部系统是和服务器并联的但外网无法直接访问,但可以构造请求并有服务器发送请求给内部系统)
文件上传
XEE(XML外部实体注入)
XML用于标记电子文件使其具有结构性的标记语言;用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
# XML声明部
<?xml version='1.0'>
# 文档类型定义DTD
<!DOCTYPE note[
<!ELEMENT note (to,form,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
# 文档元素
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don’t forget me this weekend</body>
</note>
- 文档类型定义DTD
- 内部声明DTD格式:
<!DOCTYPE 根元素 [元素声明]>
- 引用外部DTD格式:
<!DOCTYPE 根元素 SYSTEM "filename">
- 内部声明DTD格式:
- 在DTD中进行实体声明时,将使用
ENTTITY
关键字声明,实体是用于定义引用普通文本或特殊字符的快捷方式的变量,实体可在内部或外部进行声明。- 内部声明实体格式:
<!DOCTYPE 实体名称 'valud'>
- 外部引用实体格式:
<!DOCTYPE 实体名称 SYSTEM 'url'>
- 内部声明实体格式:
<?php
$xmlfile = file_get_contents('php://input');
// file_get_contents():获取客户端输入的内容
$dom = new DOMDocument();
// new DOMDocument():初始化XML解析器
$dom->loadXML($xmlfile);
// loadXML():加载客户端输入的xml内容
$xml = simplexml_import_dom($dom);
// simplexml_import_dom():获取XML文档节点
$xxe = $xml->xxe;
$str = "$xxe \n";
echo $str;
?>
WAF简要认知
WAF(Web应用防火墙);通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护。
WAF分类
软件型WAF:以软件形式安装在所保护的服务器上,可以接触服务器上的文件,继而直接对服务器上的文件进行检测,发现是否有WebShell、文件变动、目录变动……
硬件型WAF:以硬件方式部署在网络链路中;可以拦截、检测串联链路上服务器的恶意流量、监听并记录。
云WAF:一种反向代理的形式工作;通过配置NS记录(域名服务器记录)或CNAME记录;使对网站的请求报文有限经过云端的WAF主机,在被云WAF主机进行严格的过滤后将安全可靠的请求报文转发给实际的WEB应用服务器。自带防护功能的CDN。一般只要发现背后的服务器IP就能绕过云WAF。
内置WAF:Web应用服务器的内置WAF泛指Web应用和服务器对请求的安全过滤检测;普遍的嵌入在Web服务的代码之中。
WAF鉴别
自动判断:方法诸多
手工判断:在相应的网站URL后面加上基础的注入、xss等测试语句,并且要求无WAF也报错的(最好是给一个不存在的参数进行测试);测试参数触发WAF的防护机制,通过响应的报错页面判断WAF种类。
WAF绕过
大小写混合
URL编码:对URL请求进行一次或两次URL编码
替换关键字:WAF一般是删除请求中的关键敏感词,这里可以采用双写和其他方式绕过
使用注释:SQL注释注入绕过
多参数请求拆分
注入参数到Cookie中:一般WAF只检测GET/POST
Web安全攻防(简)学习笔记的更多相关文章
- JavaSE 千寻简学习笔记
JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...
- Web客户端数据存储学习笔记——Cookie
今天对登录访问的安全以及web客户端存储做了一些大致的学习,决定在这方面加深理解,记录在博客里.第一个接触到的是Cookie... WHAT? WHY? HOW? 在学习cookie的使用时发现其名称 ...
- 《精通CSS:高级Web标准解决方案》学习笔记(上)
鉴于国产CSS书籍基本都是辣鸡的现状,我在半年前动用某工作室的购书资金采购了一些技术书籍,这本广受好评的<精通CSS>也在其中.但是在阅读过后我深深的感觉到,如果说CSS本来已经是一种很琐 ...
- Web 在线文件管理器学习笔记与总结(19)上传文件
dir.func.php 中添加方法: /* 上传文件 */ function uploadFile($fileInfo,$path,$allowExt = array('jpg','jpeg','p ...
- 《响应式Web设计实践》学习笔记
原书: 响应式Web设计实践 目录: 第2章 流动布局 1. 布局选项 2. 字体大小 3. 网格布局 4. 混合固定宽度和流动宽度 第3章 媒介查询 1. 视口 2. 媒介查询结构 3. 内嵌样式与 ...
- web自动化测试中接口测试学习笔记
一.web基础 web是实现:客户端浏览器端<—————>服务端 交互的应用: web通常包含两部分:web客户端.web服务端:web客户端技术包含html.javascript.aj ...
- 如何防御mimikatz致敬Mimikatz攻防杂谈学习笔记
零.绪论:mimikatz简介 mimikatz是一款出色的内网渗透工具,可以抓取windows主机的明文密码.NTLMhash值或者kerberos对应的缓存凭据.mimikatz的使用在获取权限后 ...
- 如何用katalon录制回放一个web UI测试—— katalon学习笔记(四)
,首先打开katanlon,进入到katalon主界面,选择点击file->new->project ,在创建新项目弹出框中Name输入项输入项目的名称:Type选择web,也就是你要测试 ...
- Web 在线文件管理器学习笔记与总结(17)复制文件 (18)剪切文件
(17)复制文件 ① 复制文件通过copy($src,$dst) 来实现 ② 检测目标目录是否存在,如果存在则继续检测目标目录中是否存在同名文件,如果不存在则复制成功 file.func.php 中添 ...
随机推荐
- 05 . ELK Stack+Redis日志收集平台
环境清单 IP hostname 软件 配置要求 网络 备注 192.168.43.176 ES/数据存储 elasticsearch-7.2 内存2GB/硬盘40GB Nat,内网 192.168. ...
- OFDM通信系统的MATLAB仿真(2)
关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...
- js获得url传过来的参数
function getParam(url) { var arr = url.split('?'); //取?以后 var a ...
- 面试题二十二:链表中倒数第k个节点
方法一:双指针法定义两个指针A.B,A先走k-1步后再一起走,直到A.next==null注意: 1.链表为空 2.链表长度小于k 3.k<=0 当题目是求链表的中间节点时,可以两个指针从开头开 ...
- ORACLE_19c用户密码登录失败的问题以及ORA-28040
测试环境19c 本地登录无异常,创建测试用户,电脑Plsql登录提示报错ORA-28040,处理后再次登录提示密码错误,最后重置密码再次登录OK? 通过这个问题再次测试及反思: 1.ORA-28040 ...
- SQL数据库优化总结
1.在表中建立索引优先考虑 where.group by使用到的数据. 2.查询的sql语句中不要使用select * ,因为会返回许多无用的字段降低查询的效率,应该使用具体的字段代替*,只返回使用到 ...
- Ionic 移动端
<body ng-app="testApp"> <ion-header-bar align-title="left" class=" ...
- js POST调用api接口时,由于OPTIONS请求导致服务器异常
1.学习心得 当你搜到这个问题时,就表示你已经知道了脚本POST请求接口时,会先执行一次OPTIONS类型的请求.至于为什么会这样,在此就不做描述了,想知道的小伙伴可以查一下:本文主要将我在现实中遇到 ...
- PHP sinh() 函数
实例 返回不同数的双曲正弦: <?phpecho(sinh(3) . "<br>");echo(sinh(-3) . "<br>" ...
- PDO::query
PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 publ ...