补充关于第一阶段sql注入知识/背景,第二节阶段命令执行详细过程及其知识点
Task
|
|
Solution
SQL注入
这是第一关。查看源代码后,有如下tips:
所以目标很明确。
经过测试,过滤了information等关键字。而union,select等则没有过滤。
获取表名
文章中利用的是Polygon()函数,这个也被过滤了。我换了linestring()来报错注入。
|
|
得到如下信息:
除了linestring和Polygon外,其他同样能用来报错获取得到当前表名和字段的还有:
- multiPolygon(id)
- multilinestring(id)
- GeometryCollection(id)
- MultiPoint(id)
查询字段名
其实这一步,可以跳过。因为利用union搭配别名子查询,可以达到在不知道字段名的时候进行注入。
为了完整性,这里试一下注出字段名。
基本的原理是子查询中不允许出现相同的表名,本地环境测试如下:
之后可以利用using来逐步爆出字段名:
举一反三:
第一步:
第二步:
第三步:
得到如下信息:
查询数据
|
|
最终获得完整的结构与数据如下:
其他
在做的过程,有想利用innodb引擎来注入,不过好像没啥用2333
根据tips,得到下一个入口地址:d067a0fa9dc61a6e7195ca99696b5a896.php
PHP的命令执行
http://182.254.246.93/d067a0fa9dc61a6e7195ca99696b5a896.php
到了这里就跟 32c3 2015 ctf-TinyHosting的题目很像了。
就几个知识点展开说一说。
一个是php的短标签。当php.ini的short_open_tag=on
时,PHP支持短标签,默认情况下为off。当开启后能执行<? ?>
标签内的php语句:
另一个知识点是php的反引号命令执行,php会反引号内的内容作为shell命令执行,效果与 shell_exec()同。
第三个知识点是关于php的echo,echo有个快捷写法,可以在打开标记前直接用一个等号。见下:
我们的需求:执行命令,得到回显。结合上面三个知识点,在7个字节的限制下,比如构造如下():
(题外话:命令w
用于显示已经登陆系统的用户列表)
运行结果:
不过怎么执行任意命令呢?这里用到第四个知识点,shell中的通配符*
会将符合模式的文件列出来,之后执行,详情可见这里Shell 通配符。所以当文件夹下有如下文件:
而我在shell中直接键入一个*
即:
shell会匹配并进行替换,完成替换后实际执行的命令为:
由于这属于shell后台自动完成就不展示了。
接着要考虑一点,我们需要用*
来利用文件名执行任意命令,因此在文件名的构造顺序上需要注意。比如我们最终要在文件下生成这三个文件:
才能成功的执行c.sh。
附上利用脚本:
flag:
小结
- 基于报错的sql注入:
- 获取库名,表名,列名,数据
- join using
- php技巧:
- 短标签
- 反引号
- echo缩写
- shell通配符