##SQL注入
一:SQL注入测试规范:
注入漏洞,只要证明可以读取数据就行,严禁读取表内数据。
二:SQL注入原理:
上图中,要明白sql注入是发生在数据访问层中。这就说明在前端中即使没用输入框也会有sql注入发生。
总的来说呢:sql注入发生于应用程序与数据库层的安全漏洞。 网站内部直接发送的SQL请求一般不会有危险,但实际情况是很多时候需要结合用户的 输入数据动态构造SQL语句,如果用户输入的数据被构造成恶意SQL代码,Web应用又未对动态构造的SQL语句使用的参数进行审查,则会带来意想不到的危险。
三:SQL的利用
先要在脑中有个概念,数据库的层级关系:
- 数据库中有多个数据库—> 库中会有多个数据表—>数据表中有多个字段—>字段中存储这我们要的数据.
- 那么我们要在sql注入时要一层一层查询的。
用MYSQl来学习基础的数据库知识。
MYSQL系统库:
1. information_schema库
信息数据库,存放数据库名,数据库表,表字段的数据类型,访问权限等信息。 它里面包含了的表有:
- SCHEMATA表:
当前Mysql实例中所有的数据库信息。字段:schema_name 保存当前数据库服务器里面所有库名的信息。 - TABLES表:
提供数据中表的信息。字段:tables_name,保存了当前数据库服务器中所有数据库表名 。table_schema 是数据库的名称。table_name 是具体的表名。table_type 表的类型。 - COLUMNS表:
提供了表中列的信息。字段:columns_name 保存所有数据库服务器所维护的所有数据库的信息。
2. mysql库:
MYSQL的核心数据库,存放数据库的用户,权限设置,关键字等MySQL自己要使用的控制和管理信息。
3. performance_schema 库:
内存数据库,数据放在内存中直接操作的数据库。相对于磁盘, 内存的数据读写速度要高出几个数量级,将数据保存在内存中相 比从磁盘上访问能够极大地提高应用的性能。
4. sys 库:
通过这个数据库数据库,可以查询谁使用了最多的资源 基于IP或是用户。哪张表被访问过最多等等信息。
SQL注入带来的威胁:
- 猜解后台数据库,盗窃网站敏感信息
- 饶过验证登录网站后台
- 借助数据库存储过程进行提权等操作
sql语句:
- select * from yyy ##从yyy中查找所有数据 ,*代表所有。
- **select … ** union select … 用来拼接两条语句的。
- select yyy where ZZZ 条件查询,当ZZZ为真,查询yyy,就和if语句一样。
- show databases; #查询当前数据库的所有数据库。
- show tables; 查询当前数据库的所有表
- order by 字段名 # 以该字段名排序,在sql注入中用来猜解字段数,若是跟数字就是以该数字位置的字段名排序,若没有这么多的字段数,报错,就可猜出字段数。
函数: - user() 当前用户名。
- database() 当前所操作的数据库名。
用过的注入语句:
- xx’ union select 1,2,3,4,… # 联合查询注入,试出正确的字段数,再进行替换注入语句。
- xx’ or 1=1 # 布尔型注入
- xx’ and sleep(2) 基于时间延迟注入,根据网页的响应时间来判断注入点。
- xx’;drop database databasename; stacked queries堆叠注入
- 有的页面能够输出sql报错的信息,则可从中获取信息。
SQL注入一般的步骤:
- 找出注入点,根据网站的响应来进行注入。
- 先找到库名、用户名,要用到 database()、user()。
- 再找到当前库下的所有表名,找出可能有信息的表,要用到系统库,基本的查询语句:“select table_name from information_schema.tables where table_schema=database() #”
- 获取表中的字段信息:“select column_name from information_schema.columns where table_name=‘xxx’ and table_schema=database(); #”
- 知道字段后就可以从中查出数据。
注:要通过靶场去练习,更能深刻的理解内容。推荐靶场pikachu,dvwa。还可以从GitHub上面找一些师傅上传的靶场。
四:靶场练习
①:靶场SQLi-lab
- 安装靶场:
一个专业的SQL注入练习平台。
下载:sqli-lab下载
安装的话就可以在PHPstudy中搭建一个mysql和apache的环境。Ⅰ:把源码放置在phpstudy的WWW根目录下。
Ⅱ:在phpstudy上创建一个网站,并且创建一个数据库名为security的数据库,数据库的用户名和密码自己设定就行。
Ⅲ:再把源码中的sql-lab.sql导入数据库
Ⅳ:将下载的代码中sql-connections文件夹下的db-creds.inc中的参数修改一下。改成创建的数据库的用户名和密码。
Ⅴ:环境搭建好,访问网站,先点击下图中粉色的链接。
出现下方的显示,表示数据库安装完成。就可以使用了
2. 手工注入
Ⅰ. 咱们刚开始先判断有没有注入点。看看对于输入的数据有没有严格的检查过滤,如果网站执行了输入的语句那么就存在注入点(判断注入点不仅仅是执行了,它报错了也是有注入点的。)
Ⅱ. 判断了出注入点之后要,猜解列名数量,用”order by N“来猜。
Ⅲ. 报错,判断回显点。
Ⅳ. 信息收集。 数据库版本:version()、用户名:user()、当前数据库名称:database()
Ⅴ. 使用对应的sql进行注入。利用系统库来查库、表、列中的数据,得到我们要查询的信息。
用sqli-lab第二关为例。
- 在第二关的页面上,试用一个简单sql语句,发现会报错,说明我们用id传上去的参数是被数据库给执行了的。那么我们就可以构造一些sql语句去查他数据库的数据。
- 知道有注入点,我们用 “order by N“来猜解字段数。发现N=4时报错,说明该表中就4个字段。
=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=++++++
- 知道3个字段,判断回显点,用union来找出回显点,发现是2和3 的位置是回显点。(ps:我下载的靶场被 LIMIT 0,1限制只能在页面上显示一条数据,所以我把id的参数输入了不会查询到数据的参数)
?id=0 union select 1,2,3
- 发现了回显点,我们就可以收集到一些信息了。数据库 5.7.26版本 用户信息:root@localhost 还有数据库名:security- 开始注入吗,利用前面的信息和系统库来查
知道数据库名:security,开始查表名【用到系统库中tables表中的table_name 】
union select 1,table_name,3 from information_shcema.tables where table_schema='security';
我们利用上面语句查到:emails,referers,uagents,users。 以上最有可能有用户信息的是users表。
- 我们找到表名,开始找列名。用sql语句得到的数据有:user_id,first_name,last_name,user,password,avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password
这里username,password可以用到。
union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'
- 得到了字段名,还知道表名了,就可以查了
union select 1,group_concat(username),group_concat(password) from users
这里就完成了注入,得到了所有的用户名:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
和密码:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
更多推荐
SQL注入的总结
发布评论