HCTF2018 WarmUp
这道题还是挺有意思的,不过还没完全吃透,看着别人的WP勉强能看懂一点。
按F12发现存在source.php,进入页面后发现源码
1 |
|
①class定义类详细解释
③isset判断变量是否定义,is_string判断是否为字符串。
④in_array的详细用法
⑥include的使用
首先尝试/?file=source.php页面返回的仅仅是又打印了一边source.php中的源码,接着尝试
/?file=hint.php发现页面底部出现了flag在ffffllllaaaagggg的字样。然后尝试
/?file=hint.php?../ffffllllaaaagggg至于这里的?我现在还是不太懂,然后逐渐增加../的数量,增加到第5个时,flag出现。
[强网杯 2019]随便注
首先要了解一下PHP中的数组,以及var_dump函数。
这里要用到堆叠注入
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
摘自:
作者:dawsonenjoy
链接:https://www.jianshu.com/p/c50ced83414d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
判断闭合方式
用Hackerbar,不要直接在输入框里输,会过滤。
经过判断后,闭合方式为单引号。
判断字段数
判断判断字段数,结果为2。
爆库
接着用union 和select爆库,结果发现select被过滤了,不能用

这里要用到show databases,注意与select database()的区别,前者是显示所有数据库名称,后者是显示当前数据库名称。

爆表,爆字段

words表中的字段

1919810931114514中的字段

查看flag
根据words中字段的回显,有很大可能输入的数为id,然后猜测语句为
select id,data from words where id=
根据1' or 1=1--+的回显,可得words表为
| id | data |
|---|---|
| 1 | hahahah |
| 2 | miaomiaomiao |
| 114514 | ys |
所以,我们把表名1919810931114514改为words然后查询flag即可
1 | 1';rename table `words` to `words0`; |
然后用1' or 1=1;--+查询的flag

粗心的小李
scrabble的用法请见这里。用docker搭建测试环境后,用Ubuntu打开物理机的IP v4地址。

然后用scrabble直接获取源码,得到flag。

[SUCTF 2019]EasySQL
首先尝试了一波判断闭合方式,结果发现越来越不对劲,有三种回显,要么空,要么是数组,要么就是Nonono,然后尝试了堆叠注入,发现果然行!!!但是最后用到show columns from Flag却回显Nonono,初步判断有字符过滤,于是用Fuzz字典判断一下过滤的字符,结果如下
| handler |
|---|
| like |
| sleep |
| delete |
| or |
| insert |
| & |
| && |
| handler |
| INFORMATION |
| xor |
| AND |
| CREATE |
| from |
| “ |
然后又进行了一番尝试,发现2和2;返回值不一样,说明输入的值被嵌入了某个语句中。
方法一:
PIPES_AS_CONCAT:将【||】原本的“或”转换为“连接字符”,就是将||前后进行拼接
使用方法:PayLoad1【1;set sql_mode=PIPES_AS_CONCAT;select 1】
拼接过后的结果就是【select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag】
方法二:
我们传递过去的内容会被解析为$sql = “select “.$post[‘query’].”||flag from Flag”;
因此我们可以在传递值这边做文章,让数据库进行错误的判断
我们可以尝试传入1,1
返回回来的结果

在数据库中的操作
我们可以发现,这里的内容查询不是对【1,1】||【flag】而是对【1】,【1||flag】
这就是数据库对符号的判断不严谨,导致的非预期漏洞
我们就可以将”,”前的内容改为“ * ”, 从而构建PayLoad【 *,1 】
PayLoad2:【 *,1】
[ACTF2020 新生赛]Exec
这里又出现了新知识。
Linux中的命令连接操作符
- 和号操作符 (&) ‘&’的作用是使命令在后台运行。只要在命令后面跟上一个空格和 ‘&’。你可以一口气在后台运行多个命令。
- 分号操作符 (; ) 分号操作符使你可以一口气运行几个命令,命令顺序执行。
- 与操作符 (&&) 如果第一个命令执行成功,与操作符 (&&)才会执行第二个命令,也就是说,第一个命令退出状态是0,后面的才会执行。在UNIX里面,0表示无错误,而所有非0返回值都是各种错误。
- 或操作符 (||) 或操作符 (||)很像编程中的else语句。上面的操作符允许你在第一个命令失败的情况下执行第二个命令,但第一个命令成功则第二个不会执行
- 非操作符 (!) 非操作符 (!)很像except语句。这个命令会执行除了提供的条件外的所有的语句。这个是纯逻辑操作符,注入很少用
- 管道操作符 (|) PIPE在将第一个命令的输出作为第二个命令的输入时很有用。
- 优先操作符 () 指定优先级
- 连接符 () 连接符 ()如它名字所说,被用于连接shell中那些太长而需要分成多行的命令。可以在输入一个“\”之后就回车,然后继续输入命令行,直到输入完成。
这里首先要判断该题的类型,题目为Exec,所以这里我们有必要知道什么是Exec和Shell。Exec的中文意思是”命令执行“,所以这里和SQL注入关系不大。
上面我们了解了linux中的命令连接符,所以我们逐级构造1;cd ../;ls1处可以随便输。
当构造为1;cd ../../../;ls时,目录中出现flag

然后获取flag就可以了1;cd ../../../;ls;cat flag

[极客大挑战 2019]Secret File
查看源码发现./Archive_room.php,进入该文件。
查看源码发现action.php文件,但是打开后变成end.php文件。所以判断结果为action.php出现时间很短,然后立即出现了end.php文件。所以我们这里用Bp拦截,然后发现action.php文件源码中有secr3t.php文件名,所以我们继续访问该文件。然后发现该文件中提示源码在flag.php文件中,所以我们再进入flag.php文件。进入后提示flag就在这里,只是我们看不到,找遍源码也没找到。所以猜测是被过滤了。所以这里要用到php://filter协议,所以我们让文件以base64编码的形式输出,就不会被过滤了
构造?file=php://filter/convert.base64-encode/resource=flag.php,因为要看到输出的base64编码,所以要再secr3t.php界面输出,结果如图

然后解码得到flag