TCTF Luckygame复现前mysql的配置问题

Luckygame是一道注入,当时只有小m做出来。

http://www.melodia.pw/?p=902

当时比赛的环境(php7+mysql5.7),测试那个uplog函数注入的payload是没问题的

http://192.168.201.3/?bet=2' + if((substr((database()),1,1)='d'),1,1-~1))#&guess=1

但是有大佬线下复现时发现类似payload会报错如下

ERROR 1292 (22007): Truncated incorrect DOUBLE value:

而在mysql5.7之前的版本就不会这样。

整个sql语句如下

 INSERT INTO logs VALUES (id+1,'1|Update 2' + if((substr((database()),1,1)='d'),1,1-~1))#

经过测试发现mysql5.7对于insert和update 中间内容要求非常严格,如果在里面出现运算操作,必须要求两边为bool型或整形,所以这种左边为字符串的就会报错

那比赛的环境是如何配置的呢?

后来翻到一个日本大佬写的文章

http://www.mbsd.jp/blog/20160909.html

mysql5.7后默认使用strict模式,即如上所说的严格规范insert和update中间的操作。

官方文档是这样说得

严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。

 

对于事务表,当启用STRICT_ALL_TABLESSTRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。

 

对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:

 

· 对于STRICT_ALL_TABLESMySQL返回错误并忽视剩余的行。但是,在这种情况下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。

 

· 对于STRICT_TRANS_TABLESMySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL都会生成警告而不是给出错误并继续执行语句。

只要把这个模式取消掉,就可以达成比赛的效果了。

  • 用支付宝打我
  • 用微信打我

发表评论

电子邮件地址不会被公开。 必填项已用*标注