不管是什么网页或者网站都是需要将你的数据传输到数据库中,登录页面,商品页面,搜索页面都会有。 他会根据你输入的信息,去数据库里边进行查询查看,那么我们如果输入的sql语句那他会不会执行?
如果网页中存在这种前端同学疏忽的判断语句,那么利用sql注入的方法可以将数据库的表名,字段名,甚至一些隐私信息获取到。那么将会面临网站甚至公司的瘫痪。
Sql注入按照注入点的参数类型分类 分为 int数值型 string字符型以like搜索型
这里讲一下string字符型
Sql注入的过程:
构造测试语句----提交请求------分析返回结果
如果符合预期结果就说明存在漏洞,如果不符合可以更换构造的测试语句,如果还是不行就说明不存在漏洞。
接下来以靶场的例子作为一个展示,进入熟悉的DVWA靶场,这里这个级别选low
因为默认是impassbile,翻译过来就是不可能。
来到这个 <SQL Injection>,先判断这个是字符型注入还是数值型,输入数字1来看一下结果。 可以看到是有结果的
那继续输入1' 如果还是不行的话可以输出1" 或者1),因为这是字符型最常见的三个
可以看到是出错了,那么继续输入1’#(这里这个#在数据库中是注释的意思,就是如果后边还有其他命令给他注释掉)
从这里开始每个字符都是英文
这里又好了,在1后边加上单引号的意思就是看他是不是字符型 因为它这里的sql语句有可能是:
Select first_name from users where user_id=’ ’;
加上咱们刚才输入的1’# 就变成了以下的语句:
Select first_name from users where user_id=’1’#’;
在这里看到任何效果,那就去数据库中执行一下,看看,这是上边的语句
然后执行出来
这里出现了结果,虽然不一样,但是基本可以判定是单引号的字符型,如果还没有看出来还可以继续尝试,接下来就输入一个1+2,如果是数值型1+2等于3,应该出来3的数据,如果是字符型的话就出来的是1的数据
出来的还是admin,那么这就可以肯定是字符型了,如果你还有质疑,直接进数据库,查看
数据明显是不一样的,不带引号跟带引号的结果是不一样的。那么接下来数据库有一个命令是union(联合查询)将多条查询语句的结果合并成一个结果
那么咱们直接使用union配合select语句是不是可以看到数据库里边的数据?看数据之前需要使用order by命令 这个命令在数据库里边是排序的 默认是升序(esc)降序是desc
order by 1就是对第一列字段进行排序,这样可以测试他这条命令一共几个字段,有几个就需要在select后边写几个,如果只是想看一个的话会出现下边这个错误,我这边输出的是
1' union select database()。
Select database()是查看数据库的
这个提示大概就是说,使用的select语句有不同的列数。怎样避免这个问题,就用order by来测试
上边就可以看到输入3的时候出错了,说不知道有第三列,那么它可以查找两列
这个测试完了之后,就可以真正的开始注入,来输入1’ union select 1,database()#
这里的select 1中的1没有实际作用,只是用来当一个参数
可以看到数据库名已经出来了,我这个叫Surname=root是因为我更改了之前的数据库文件,默认的是dvwa大家不要担心。
这里给大家补充一个数据库的知识点,因为这里要使用mysql自带的元数据:
table_name 代表数据库名,table_name 代表表名,column_name代表字段名
information_schema可以看做一个具体的数据库 information_schema.tables是用来查找表名的 information_schema.columns 是用来查找字段的
数据库出来了就可以查看里边的表了 这里输入 1' union select 1,table_name from information_schema.tables where table_schema=’root’#
可以看到里边有两个表 一个是guestbook 一个是users,表都看到了,那么看一下users里边的字段吧,因为user的中文是用户,里边放了用户名跟密码。(注意!:如果你想要注入其他的私人网站需要经过同意,因为这样是违法的)
然后输入这条命令:
1' union select 1,column_name from information_schema.columns where table_name='users' and table_schema='root'#
这里获得了这个users表的账号跟密码的字段名,那么就可以,使用这两个字段名来获取所有的账号跟密码的信息
然后这里输入
1' union select user,password from users#
拿到这些东西基本就结束了,这是最常用的语句,只需要稍加改动,用到搜索型以及数值型都可以用。