外链网站大全,乐山建设局网站,网站前后台模板,厦门市建设局网站文章目录 1. 介绍2. 无密码登录3. 无用户名无密码登录4. 合并表获取用户名密码 1. 介绍 假设你用自己的用户名和密码登录了一个付费网站#xff0c;网站服务器就会查询一下你是不是 VIP 用户#xff0c;而用户数据都是放在数据库中的#xff0c;服务器通常都会向数据库进行查… 文章目录 1. 介绍2. 无密码登录3. 无用户名无密码登录4. 合并表获取用户名密码 1. 介绍 假设你用自己的用户名和密码登录了一个付费网站网站服务器就会查询一下你是不是 VIP 用户而用户数据都是放在数据库中的服务器通常都会向数据库进行查询要向数据库进行增删改查操作就需要用到 SQL 语言。 但是作为 SQL 的注入攻击者我们并不知道网站的密码是什么甚至都不知道用户名是什么那就不能按正常套路出牌了。 这个时候我们不输入正常的数据而是把数据转换成代码使得服务器向数据库的正常查询变成了不正常的代码执行 那么攻击者就可以执行自己想要的操作了。 如下代码这是正常的查询操作只有用户名和密码都匹配时才能成功登陆。
select * from users
where
username栈老师 and password123456但是服务器如果没有过滤用户输入的数据就很危险了比如说我们在用户名最后加上一个单引号在 SQL 执行的时候一对引号里面的东西会视为字符数据但是因为这里的引号不成对因此这条查询语句是会直接报错的如果此时服务器把这条 SQL 报错信息直接返回给用户那么攻击者就知道具体是什么原因导致报错了 SQL 注入攻击的门也就这样打开了。 2. 无密码登录 如果我们在用户名的单引号后面加上两个-事情就不一样了。在 mysql 内部系统遇到两条横杠就会认为从此处开始到该行结束中间的内容都是注释而注释是不会被视为代码执行的 相当于只会执行前面部分的 SQL 语句。 所以只知道用户名即使没有密码也是可以进行登录的代码如下
select * from users
where
username栈老师 -- and password1234563. 无用户名无密码登录 上面是只知道用户名不知道密码的情况。那如果我们连正确的用户名信息都没有呢 SQL 语句在遇到 where 关键词的时候会判断条件是真还是假我们把这里的条件放在 or 里面进行拼接因为 or 的一边为真那么整体就为真所以我们只需要再增加一个为真的条件就可以了 比如 11这个时候即使用户信息错误where 的逻辑判断也总是为真。 那么即使不知道用户名和密码依然可以登录
select * from users
where
username栈老师 or 114. 合并表获取用户名密码
我们都知道合并两个表格可以用 union 关键字像下面这样
select * from table1
union
select * from table2mysql 规定union select 的后面可以不指定表名只需要两个表格的列数相同、数据类型对应即可。 所以我们直接在 select 后面用 null 来代替列名。null 代表没有值但是 union 必须要保证合并两边的列数是一致的攻击者就可以通过增加 null 的个数来测出表格的列数。 select * from products
union
select null, null, null攻击者现在用其他方法知道了另一个表格用户表的信息那就可以把表格的列名放在 null 的位置并且指定选取的表格名。 但是 union 除了要保证列数一致以外还要保证数据类型的相似性否则是无法进行合并的。 实际上攻击者在确定好列数以后还会进行数据类型的判断比如逐列进行测试。测试完毕之后就可以把所有的东西都放在一起了。 首先在可以注入的地方用单引号强行终止数据内容并且加上两个横杠使得后面的语句失效这样 SQL 语句就不会报错。 这样攻击者就可以在此处注入 union 语句了
select * from products
where name apple
union
select null, username, password from users --此时账号密码信息就这样被合并到 products 表中了