天天说SQL注入,写程序的时候要如何如何避免SQL注入,有多少人根本都不知道SQL注入是怎么注入的?
下面是SQL注入的一个简单实现步骤
首先我自己简单写了一个有SQL注入漏洞的接口用来测试
第一步:判断接口是否存在数据库注入漏洞
使用and 1=1,使条件成立,看接口是不是还可以正常返回数据
使用and 1=2,使条件不成立,看接口是不是不返回数据了,或者报错
上面两个步骤达到预期结果,就说明这个接口存在SQL注入漏洞
第二步:判断字段数
虽然看起来是返回了两个字段数据,但是SQL不一定查了两个数据,可能在程序中处理过后才返回的两个数据,所以需要判断SQL到底查询了几个字段
使用order by (一个数字)来依次请求,判断接口的SQL查询了几个字段。
先使用order by 1来试试,结果没问题
再使用order by 2 后面3 4 5,直到接口报错或者不返回数据,就说明SQL查询的字段数是前一个不报错的数字,我这里是查询的三个字段,所以到4的时候就报错了
现在知道了SQL查询的是字段数是3
第三步:判断回显点
回显点可以将我们输入的SQL语句执行,并返回回来
先试用and 1=2 使原SQL的条件不成立,再使用union 加上自己的SQL
我这里是用的Oracle,mysql可以直接select 1,2,3
可以看到报错提示数据类型不匹配,那就换成下面三个试一下,一般不是number就是varchar,看第几个字段可以返回回来1。
'1',null,null
null,'1',null
null,null,'1'
第一个字段可以返回,说明可以在第一个字段这里写我们想查询的东西
可以查询实例名
可以查询数据库版本