SUCTF2019-checkin
是文件上传,这种我做过很多了,大部分常见的我基本上都做过,但是这题让我有了新的认识
先开始弄吧,很简单的,主要就是.user.ini这个配置文件的知识点
这题我先乱传东西,发现大部分都被过滤了,
有个东西说我这个不是images文件,去查了一下那个给我报错的函数
exif_imagetype()函数:只检查文件头是不是图片类的,那这很简单了,我直接构造带着jpg文件头的图片码,传上去,发现被过滤了,提示说<?也被过滤了,没事,我的祖传payload很多,用另外一句
1 | <script language="php">@eval_r($_POST[sb])</script> |
绕过<?限制的一句话;传上去之后发现传参无法执行接下来传个phpinfo上去,发现没有变成那个页面,应该是php机制被ban了,这里不能执行php语句
接下来就涉及到新的知识点.user.ini文件的配置(注意要与传上去的文件名一致)
先传.user.ini然后再传一句话木马,很简单的baby,最后要么蚁剑连接要么就命令执行rce
蚁剑连接我就不必多言,主要还是rce,因为不知道为什么,我常规的system(‘ls’)这种在此处不起任何作用,来看看wp中的rce是怎么做的
1 | ploads/c47b21fcf8f0bc8b3920541abd8024fd/index.php?cmd=var_dump(scandir("/")); // 扫描当前目录下的文件,并打印出来 |
这个时候就要去拷打AI了
原来var_dump()这么好用啊,我哩个大豆,那我可得要好好用这个了
还有一条是用var_dump()和searchdir(‘')来代替ls
太权威了,file_get_content()
举个例子理解user.ini作用:
/这是.user.ini的两个配置
auto_prepend_file是在文件前插入
auto_append_file是在文件最后才插入/
1.在user.ini 中设置
auto_prepend_file=b.gif
2.在b.gif中设置 一句话木马
3.还有个php文件 如:前面做题中的index.php
如果这三个条件在同一个目录下面,就会出先问题,这里就相当于 在index.php中写了include “b.gif” , 可以进行文件包含,导致的后果是:当我们对目录中的index.php进行访问的时候,会调用.usre.ini 中的文件把b.gif文件以php的形式进行读取,造成userini的漏洞
局限
在.user.ini中使用这条配置也说了是在同目录下的其他.php 文件中包含配置中所指定的文件,也就是说需要该目录下存在.php 文件,通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。
但是有时可以使用 ../ 来将文件上传到其他目录,达到一个利用的效果。
Zer0pts2020-Can-you-guess-it
猜谜语吗
这题刚进去有点东西,看看源码
上面一串和鹤城杯的easyp有点像,看看下面了,随机生成一串什么什么数,然后再一串一串的搞,反正很复杂,我看着也没什么问题,感觉从这里入手有点难
没回显,没cookie,通过提交字符串来得到flag应该是不可能的,这个时候看看wp
暴露了,这里由basename的特性和$_SERVER[‘PHP_SELF’]的特性来决定的
首先flag在config.php当中
然后看basename的那一行
$_SERVER[‘PHP_SELF’]会获取我们当前的访问路径,并且PHP在根据URI解析到对应文件后会忽略掉URL中多余的部分
那么这两种url格式都可以访问到index.php
1 | /index.php |
其实作用也很显然了,这里再来一个例子
1 | $var1="/config.php/test" |
懂区别所在?
basename可以理解为对传入的参数路径截取最后一段作为返回值,但是该函数发现最后一段为不可见字符时会退取上一层的目录
接下来就显然了,通过构造URI让其包含config.php这个文件名再让basename函数截取出来,之后通过请求参数source就能显示config.php的源码,也就能见到flag了
(源代码写的请求source)
这里要用到一点污染的手段
正则匹配的是路径的末尾,那么用个/config.php/%ff这种的,就可以直接绕过去了
接下来补充点知识
$_SERVER[‘PHP_SELF’]表示当前执行脚本的文件名,当使用了PATH_INFO时,这个值是可控的。所以可以尝试用/index.php/config.php?source来读取flag
basename函数的特性
1 | var_dump(basename("xffconfig.php")); // => config.php |
CISCN-2019-初赛-Love-Math
博客的图片功能还未修复,因此将就的用纯文字来书写了
这题刚进去,就知道是rce了,此处绕过了一些东西,但是php关于数学的函数还是都可以调用的
按照rce常规的思路,大概是要打一个
bash: c=((_GET[abs])(((_GET[acos])))&abs=system&acos=ls)
但是在此处存在过滤啊,abs,acos什么的都是合法字符,但是_GET并不是,Susen师傅说想试试其他的绕过方法,包括取反,异或,自增,自增在此处应该是用不了的
我第一个想法,全url编码传payload,但很可惜呐,GET无法被url编码,于是我换了一个思路,检查了一下有什么函数可以使用,看了一下,有一个base_conver这个函数,OK,有操作的空间了。
base_convert函数可以进行任意进制之间的转换,众所周知高于10的进制要引入字母了,那么36进制不就是0到9到a到z,那就可以通过这个函数构造任意我们爱用的字符串,然后加个括号就变成函数了(这很好理解)
这个时候第二个要点出现了,另外一个函数hex2bin,这个更是神中神哎,可以直接将16进制的数字转为对应的字符串,转换_GET的重任交给他了
接下来就是要以什么进制的内容交给hex2bin来进行进制转字符串了
第一点,很要的就是长度要短,因为payload限制长度了
第二点,很多小可爱要问了,为什么这里不直接再用base_convert函数来进行_GET的转换–那我问你_是字母还是数字,分明啥也不是
因此确定一下本题的转换思路,由于hex2bin不在白名单中,我们需要通过base_convert来将一个常规的进制数转为36进制数,而这个36进制数为hex2bin(这个这里是个数字,但是在后面都是当字符串用的),然后再用转换后的hex2bin来构造一个_GET,这也很好理解,但是_GET直接字符转16进制,5f是在黑名单中的哦,因此要用10进制数通过某个函数来转为16进制再丢给hex2bin来转为字符串_GET,查一下白名单,dechex可以胜任这个任务
那很好操作了,很多在线工具,我们直接拿来使用,很快就能得到
1 | bash: base_conver(37907361743,10,36)(dechex(6525245738836)) |
这个的意思就是hex2bin(某16进制数)的结果为_GET
接下来就在数学函数里面挑两个字符长度短的(这里选pi和log)来避免payload的限制,然后
1 | $pi=base_conver(37907361743,10,36)(dechex(6525245738836)); |
($$pi){pi}(这里的意思是$_GET[pi],其实大家应该都懂),同理构造另外一个($$pi){log},然后用两个&&把pi和abs的参数传上去就可以了(注意构造一个system函数的括号,直接在前面$$pi处加就可以了),就可以实现得到flag
接下来看一下完整的payload
1 | $pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}($$pi){log}&pi=system&log=cat /flag |
结束了,没什么意思,纯为别的师傅解答