数据库?
数据库是一种数据结构的存储解决方案,可分为关系型数据库(MySQL、SQLite等)和非关系型数据库(MogonDB、Redis等)。关系型数据库基于关系模型,即二维表格模型,在传统的CURD操作中可以提供快速的解决方案;而非关系型数据库源于NoSQL(Not Only SQL)的思想,更适用于分布式存储和海量数据处理。数据库注入涉及SQL语句,因此在这里以关系型数据库MySQL为例。
MySQL/SQL基础
MySQL的安装和基本使用都可以在参考链接中找到,这里仅贴上MySQL_Secure_Installation的安装流程。
MySQL_Secure_Installation
[root@myserver ~]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):<–初次运行直接回车
OK, successfully used password, moving on…
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Password updated successfully!
Reloading privilege tables..
… Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] <– 是否删除匿名用户,生产环境建议删除,所以直接回车
… Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,根据自己的需求选择Y/n并回车,建议禁止
… Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] <– 是否删除test数据库,直接回车
- Dropping test database…
… Success!
- Removing privileges on test database…
… Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,直接回车
… Success!
Cleaning up…
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
[root@myserver ~]#
什么是注入?
注入(inject)攻击产生的本质原因是输入过滤机制的不完善,导致攻击者可以利用输入数据构造执行代码,从而造成信息泄露、数据损坏、服务宕机等一系列问题。由于注入(inject)攻击常常导致严重后果,进一步催生了一切输入有害的重要安全思想。
注入如何产生?
注入攻击产生的本质是:当一段输入数据需要添加到另一端执行指令或代码中时,攻击者可以根据指令或代码的语法刻意构造一段输入数据,造成的输入数据作为指令执行的错误。
例如在PHP + MySQL平台下:
<?php
$name = $_POST['name'];
$con = mysqli_connect("127.0.0.1","root","","test") or die("error");
$query = "SELECT * FROM person WHERE name='$name';";
$result = mysqli_query($con,$query);
while($row=mysqli_fetch_assoc($result))
echo $row['age'];
这是一个用户通过输入name从person表查询对应age的场景,但是代码中没有对输入变量name为1'or'1'='1
,那么查询语句$query就会变成:"SELECT * FROM person WHERE name='1' or '1'='1';"
,然而该查询语句恒成立,意味着这样的输入将会爆出数据库person表中所有人的age,造成信息泄露。
在上面这个案例中,如果我们对query进行过滤,比如将'
和"
转义,或者字符处理掉=
,那么上面构造的输入数据不会被执行。这只是一个最简单的案例,想了解和实践更多可以部署DVWA进行测试(推荐版本1.9)。
SQL注入
根据是否有直接反馈信息分为 普通注入 和 盲注,盲注往往通过时间盲注和布尔盲注来反馈信息。
一个SQL注入的大概流程是这样的:
1.注入POC
2.猜字段数
3.猜字段顺序
4.爆数据库名
5.爆表名
6.爆字段
7.脱裤
有些步骤根据实际情况可有可无的,MySQL爆库过程中需要用到information_schema
,具体参考:
DVWA-1.9全级别教程之SQL Injection
DVWA-1.9全级别教程之SQL Injection(Blind)
后续
注入的精髓在于根据不同过滤机制进行绕过,绕过的方法五花八门,各种神仙操作,下一次关于注入的科普会涉及SQL注入中常见的绕过手段和注入姿势。挂了一大堆链接就请见谅了XD