查看: 3015|回复: 6

mysql注入求解

[复制链接]
发表于 2014-12-2 23:15:30 | 显示全部楼层 |阅读模式
悬赏5i币已解决
[AppleScript] 查看源码 复制代码
	$id = $_GET['id'];
        $sql = "select * from admin where id='$id'";
        echo $sql;


        变量用单引号包起来后
        在url处输入http://localhost/sqlinject/1.php?id=1' and 1=2/*
        输出的sql语句 为select * from admin where id='1' and 1=2/*'
        

        在url处输入http://localhost/sqlinject/1.php?id=1' and 1=2--
        输出的sql语句为select * from admin where id='1' and 1=2--'
        /*和-- 都没能注释后面的单引号,这该怎么注入自己的语句呢??

最佳答案

查看完整内容

你试试这样: 在url处输入http://localhost/sqlinject/1.php?id=1' and 1=2--' 输出的sql语句为select * from admin where id='1' and 1=2--'' 这样的话''就应该没有什么影响了,个人理解啊
回复

使用道具 举报

发表于 2014-12-2 23:15:31 | 显示全部楼层
你试试这样:
在url处输入http://localhost/sqlinject/1.php?id=1' and 1=2--'
输出的sql语句为select * from admin where id='1' and 1=2--''
这样的话''就应该没有什么影响了,个人理解啊
回复

使用道具 举报

发表于 2015-1-5 14:15:06 | 显示全部楼层
mysql注释符是-- ,在--后面有个空格,你试试--%20
回复

使用道具 举报

发表于 2015-1-7 21:23:33 | 显示全部楼层

http://localhost/sqlinject/1.php?id=1' and 1=2 and '1'='1
select * from admin where id='1' and 1=2 and '1'='1'
回复

使用道具 举报

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

Re: mysql注入求解

遇到这种情况,关键在于MySQL的注释语法细节。你输入的 `--` 后面直接跟了单引号,没有空格,MySQL会把 `--` 当作两个减号,而不是注释符。同样,`/*` 需要与 `*/` 成对使用,你只用了开始注释符,没有结束符,后面的单引号被当作注释内容,实际上并没有被忽略,所以整个语句仍然包含多余的单引号,导致语法错误或查询异常。 解决方法有两个: 1. **在 `--` 后面加一个空格**(或制表符、换行等空白字符): ``` ?id=1' and 1=2 -- ``` 注意 `--` 后面必须有一个空格,这样 `--` 才会将后面的 `'` 注释掉。输出SQL变为: `select * from admin where id='1' and 1=2 -- '` 后面的单引号被注释,语句正常。 2. **使用 `#` 注释符**(MySQL也支持): ``` ?id=1' and 1=2 # ``` `#` 会注释掉后面的所有内容,包括单引号。输出SQL变为: `select * from admin where id='1' and 1=2 #'` 同样可以绕过。 另外,如果能闭合前面的单引号,也可以尝试用 `1' or '1'='1` 这样构造恒真条件,但既然你想用注释,记得加上空格或改用 `#` 即可。
回复

使用道具 举报

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

Re: mysql注入求解

你好,这个问题其实是因为注释符在SQL中的使用规则导致的。 首先,`--` 注释要求后面必须有一个空格(或换行等空白字符),你在URL中直接写 `--` 后面没有空格,所以它没能注释掉最后的单引号。而 `/*` 需要完整的闭合 `*/`,你只写了 `/*` 没有写 `*/`,所以后面的单引号依然存在。 针对这种情况,常见的注入方法是**闭合掉前面的单引号,并让后面的单引号与你构造的条件匹配**,而不是用注释符。例如: ``` or '1'='1 ``` 这样生成的SQL语句是: ```sql select * from admin where id='1' or '1'='1' ``` 后面的单引号正好和 `'1'` 匹配,整个语句语法正确,而且通过 `or '1'='1'` 实现了永真条件,可以查询出所有数据。 如果你确实想用注释符,可以试试用 `#`(MySQL中 `#` 是行内注释,不需要空格),比如: ``` and 1=2# ``` 看能否成功注释掉后面的单引号。另外,`--` 后面要加一个空格(URL编码为 `%20`),例如: ``` and 1=2--%20 ``` 不过简单起见,还是推荐用 `or '1'='1` 这种方式,更通用也更容易理解。
回复

使用道具 举报

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

Re: mysql注入求解

你好,这个问题其实挺经典的。你的 `/*` 和 `--` 没生效,主要原因是: 1. **`/*` 是多行注释**,但你的语句里没有写 `*/` 来结束注释,实际上 `/*` 会一直注释到末尾,包括后面的单引号,按理说不会影响。但你可能遇到了数据库版本或字符转义的问题。不过更常见的是,**`--` 在 MySQL 中需要后面跟一个空格**(或者控制字符),你直接写 `--'` 没有空格,注释符可能没被识别,导致后面的 `'` 依然成对出现,破坏了语法。 2. **正确做法**:用 `#` 注释(MySQL 支持),或者 `-- ` 后面加空格(注意空格)。比如: - `?id=1' and 1=2 -- `(注意 `--` 后面有一个空格) - `?id=1' and 1=2 #` 3. **更稳妥的注入方式**:既然单引号闭合了,后面还有一个单引号,你可以**构造一个始终为真的条件把后面的单引号“吃掉”**。比如: - `?id=1' or '1'='1` 这样 SQL 变成 `select * from admin where id='1' or '1'='1'`,逻辑正确且语法完整。 建议你先试 `#` 注释,很多同学用这个一次成功。如果还不行,检查下 PHP 是否对特殊字符做了转义(比如 `magic_quotes_gpc`)。
回复

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

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

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部