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的简单运用

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

Burp的简单运用

Burp初体验

Nmap的简单运用

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


SQL注入简要认识

SQL注入过程知识的摘要

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跨站脚本攻击

XSS基础学习

XSS的构造技巧

CSRF跨站请求伪造

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

CSRF漏洞原理浅谈

SSRF服务器请求伪造

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

SSRF学习

文件上传

文件上传解析漏洞

Upload-labs 测试笔记


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中进行实体声明时,将使用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安全攻防(简)学习笔记的更多相关文章

  1. JavaSE 千寻简学习笔记

    JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...

  2. Web客户端数据存储学习笔记——Cookie

    今天对登录访问的安全以及web客户端存储做了一些大致的学习,决定在这方面加深理解,记录在博客里.第一个接触到的是Cookie... WHAT? WHY? HOW? 在学习cookie的使用时发现其名称 ...

  3. 《精通CSS:高级Web标准解决方案》学习笔记(上)

    鉴于国产CSS书籍基本都是辣鸡的现状,我在半年前动用某工作室的购书资金采购了一些技术书籍,这本广受好评的<精通CSS>也在其中.但是在阅读过后我深深的感觉到,如果说CSS本来已经是一种很琐 ...

  4. Web 在线文件管理器学习笔记与总结(19)上传文件

    dir.func.php 中添加方法: /* 上传文件 */ function uploadFile($fileInfo,$path,$allowExt = array('jpg','jpeg','p ...

  5. 《响应式Web设计实践》学习笔记

    原书: 响应式Web设计实践 目录: 第2章 流动布局 1. 布局选项 2. 字体大小 3. 网格布局 4. 混合固定宽度和流动宽度 第3章 媒介查询 1. 视口 2. 媒介查询结构 3. 内嵌样式与 ...

  6. web自动化测试中接口测试学习笔记

    一.web基础 web是实现:客户端浏览器端<—————>服务端  交互的应用: web通常包含两部分:web客户端.web服务端:web客户端技术包含html.javascript.aj ...

  7. 如何防御mimikatz致敬Mimikatz攻防杂谈学习笔记

    零.绪论:mimikatz简介 mimikatz是一款出色的内网渗透工具,可以抓取windows主机的明文密码.NTLMhash值或者kerberos对应的缓存凭据.mimikatz的使用在获取权限后 ...

  8. 如何用katalon录制回放一个web UI测试—— katalon学习笔记(四)

    ,首先打开katanlon,进入到katalon主界面,选择点击file->new->project ,在创建新项目弹出框中Name输入项输入项目的名称:Type选择web,也就是你要测试 ...

  9. Web 在线文件管理器学习笔记与总结(17)复制文件 (18)剪切文件

    (17)复制文件 ① 复制文件通过copy($src,$dst) 来实现 ② 检测目标目录是否存在,如果存在则继续检测目标目录中是否存在同名文件,如果不存在则复制成功 file.func.php 中添 ...

随机推荐

  1. 1.pandas打开和读取文件

    最近在公司在弄数据分析相关的项目,数据分析就免不了要先对数据进行处理,也就自然避不开关于excel文档的初始化操作了. 一段时间之后,发现pandas更加符合我的项目要求,所以,将一些常规操作记录下来 ...

  2. Kafka入门(2):消费与位移

    摘要 在这篇文章中,我将从消息在Kafka中的物理存储方式讲起,介绍分区-日志段-日志的各个层次. 然后我将接着上一篇文章的内容,把消费者的内容展开讲一讲,区分消费者与消费者组,以及这么设计有什么用. ...

  3. SpringBoot学习之整合Druid的简单应用

    一.Druid介绍 Druid简介 Druid是目前Java语言中最好的数据库连接池之一.结合了 C3P0.DBCP 等 DB 池的优点,同时加入了日志监控.Druid 是一个分布式的.支持实时多维 ...

  4. Python for循环使用 else 语句

    Python for循环使用 else 语句: else:当 for 所有的语句代码块正常运行完,才会运行 else 语句. 示例: ''' for 迭代对象 in 序列: 代码块(一行语句或多行代码 ...

  5. [C++]类的空指针调用成员函数后,会发生什么事?

    类的实例调用成员函数的原理 其实不管是通过对象实例或指针实例调用,其实底层调用的过程都是一样的,都是把当前对象的指针作为一个参数传递给被调用的成员函数.通过下面的相关实例代码进行检验: 实验的C++代 ...

  6. 11-19 configparser模块

    该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 创建文件 import configparser config = ...

  7. PHP checkdate() 函数

    ------------恢复内容开始------------ 实例 检查一些日期是否是有效的格利高里日期: <?phpvar_dump(checkdate(12,31,-400));echo & ...

  8. PHP touch() 函数

    定义和用法 touch() 函数设置指定文件的访问和修改时间. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 touch(filename,time,atime) 参数 描述 ...

  9. PDOStatement::bindParam

    PDOStatement::bindParam — 绑定一个参数到指定的变量名(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 bool PDOState ...

  10. bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp

    LINK:上学路线 从(0,0)走到(n,m)每次只能向上或者向右走 有K个点不能走求方案数,对P取模. \(1\leq N,M\leq 10^10 0\leq T\leq 200\) p=10000 ...