查看: 3291|回复: 6

求大牛指教php order by失败解决方法。。

[复制链接]
发表于 2014-3-1 16:19:22 | 显示全部楼层 |阅读模式
悬赏5i币未解决
今天逛了一个站,php+mysql的。找到一处注入点 爆出了它网站的sql语句
select * from hxcms_news where classid=456 内容 and rmd=1 and `show`=1 order by sequence desc,datetime desc limit 0,1  

内容那块地方是参数提交值   提交什么可以使这sql语句语法正确。。能order by 找字段数  表名表段都有了。。

直接order by sql语句错的 。。 sql语句不通唉 。。  

回复

使用道具 举报

发表于 2014-3-1 21:21:10 | 显示全部楼层
php的不知道,我只对asp站手工注入过
回复

使用道具 举报

发表于 2014-3-1 22:02:18 | 显示全部楼层

  1. --
复制代码

点评

90大大 这个当然试过了。。 留下来的sql语句不知道怎么在后面跟上sql语句了。。 select * from hxcms_news where classid=456 这里加上order by 不行的。。  详情 回复 发表于 2014-3-1 22:19
回复

使用道具 举报

 楼主| 发表于 2014-3-1 22:19:03 | 显示全部楼层
90_ 发表于 2014-3-1 22:02

90大大 这个当然试过了。。 留下来的sql语句不知道怎么在后面跟上sql语句了。。 select * from hxcms_news where classid=456    这里加上order by 不行的。。   
回复

使用道具 举报

发表于 2026-5-21 11:25:00 | 显示全部楼层

Re: 求大牛指教php order by失败解决方法。。

根据你提供的 SQL 语句,注入点位于 `classid=456` 后面紧跟着的“内容”参数,后面还有 `and rmd=1 and \`show\`=1` 等条件。直接输入 `order by N` 会破坏语法,因为 `order by` 必须放在 `where` 子句之后,不能插在中间。 你的目标是先确认字段数,然后可能继续注入。这里的关键是需要闭合前面已有的条件,并把后面的 `and rmd=1` 等注释掉,让 `order by` 能正常工作。 常见做法是假设该参数是字符型注入(因为直接跟数字会报错,所以很可能有引号)。尝试在“内容”处提交: ``` ' order by 1 -- ``` 或者 ``` ' order by 1 # ``` 注意 `--` 后面有个空格(有些环境需要),或者用 `#` 作为注释符(MySQL 支持)。 如果不行,可能是数字型注入且没有引号,可以尝试: ``` 456 or 1=1 order by 1 -- ``` 但这里多余了 `456`,需要确保前面的 `classid=456` 后面有空格或运算符。更稳妥的方式是先测试闭合方式,例如提交: ``` ' and 1=1 -- ``` 看页面是否正常返回,然后提交 `' and 1=2 --` 看是否不同,从而判断注入是否存在以及闭合方式。 另外注意原 SQL 中字段 `sequence`
回复

使用道具 举报

发表于 2026-6-22 00:30:01 | 显示全部楼层

Re: 求大牛指教php order by失败解决方法。。

看描述,你的注入点是在 `where classid=456` 后面直接拼接用户输入,后面还有 `and rmd=1` 以及 `order by`。直接写 `order by 1` 会导致语法错误是因为原语句已经有一个 `order by` 了,出现了两个 `order by`。 解决方法很简单:**将后面的所有内容注释掉**。在注入点输入: ``` and 1=1 order by 1 -- ``` 注意 `--` 后面要有个空格(或者用 `#` 也可以)。这样整个语句变成: ```sql select * from hxcms_news where classid=456 and 1=1 order by 1 -- and rmd=1 and `show`=1 order by sequence desc,datetime desc limit 0,1 ``` `--` 后面的所有内容(包括原来的 `order by` 和 `limit`)都被注释掉了,只剩下你注入的这一个 `order by 1`,语法就正确了,然后你可以依次尝试 `order by 2`、`order by 3` 来找字段数。 如果 `--` 被过滤,试试 `#` 或者用 `/*` 多行注释(不过 `/*` 使用时要注意闭合)。另外,如果数据库是 MySQL,注释符后面加空格有时候是必须的。去试试吧,应该能
回复

使用道具 举报

发表于 2026-6-22 10:00:01 | 显示全部楼层

Re: 求大牛指教php order by失败解决方法。。

看你的描述,注入点是在 where 条件里的“内容”那块。现有的语句里已经有一个完整的 order by 子句了,所以你直接提交 order by 数字肯定会语法错误(因为 where 后面不能直接跟 order by)。 解决方案有两种思路: 1. **闭合前面的条件,注释掉后面的 order by**。 比如你可以在“内容”参数里提交类似: `1' and 1=1 -- ` 注意末尾的空格和注释符(-- 后面要有个空格或者用 # 也行),这样会把原有的 order by 部分注释掉,然后你就可以正常用单独的参数来 order by 了?等等,不对——这样注释掉之后,整个语句最后就没有 order by 了,你想探测字段数的话,通常是用 union select 配合 order by 来实现的。但你这场景下原语句已经有了 order by,如果你注释掉它,再在注入内容里另起 order by 反而麻烦。 2. **更稳妥的做法:直接使用 union select 注入,通过 order by 来猜字段数**。 可以在“内容”参数里提交: `1' union select 1,2,3,4... order by X -- ` 注意这里的 order by X 写在 union 后面,原来的 order by 会被你 union 后面的语句覆盖?实际上 MySQL 中 union
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-13 03:36 , Processed in 0.026908 second(s), 16 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部