二阶SQL注入理解与体会
一:SQL注入分类
SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入
二:二者进行比较
0x01:一阶SQL注入:
1;一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻击是立即执行的;
2;攻击者在http请求中提交非法输入;
3;应用程序处理非法输入,使用非法输入构造SQL语句;
4;在攻击过程中向攻击者返回结果。
0x02:二阶SQL注入:
1;攻击者在http请求中提交恶意输入;
2;恶意输入保存在数据库中;
3;攻击者提交第二次http请求;
4;为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句;
5;如果攻击成功,在第二次请求响应中返回结果。
三:危害比较
一阶SQL注入和二阶SQL注入危害一致,攻击者获得数据库的访问权限,窃取相关数据,但是一阶SQL注入可以通过相关工具扫描出来,而二阶SQL注入更微妙,通常二阶SQL注入漏洞的测试主要依据测试人员对系统功能的理解和对常出错位置经验的判断,但是应用功能的增加,经验的测试结果并不能保证测试结果。
四:二阶SQL注入原理讲解
假设一个网站数据库中存在一个用户名为:“admin”,密码为:“123456”。攻击者注册用户名为:“admin'-- ”,密码为:“123”;程序中的代码为:
String name=StringEscapeUtiles.escapeSql(request.getParameter("Name"));
String pwd=StringEscapeUtiles.escapeSql(request.getParameter("pwd"));
String sql1="insert into user(username,password) values ("name","pwd")";
程序在把输入数据存入数据库之前,对输入的数据中的单引号进行了转义来防止恶意输入对对数据库中数据带来的影响,避免了一阶注入带来的问题,但是在数据库中存入的用户名任然为:“admin'-- ”。现在攻击者要更新密码,程序会首先判断用户是否存在,代码为:
String name=StringEscapeUtiles.escapeSql(request.getParameter("Name"));
String oldpwd=StringEscapeUtiles.escapeSql(request.getParameter("oldpwd"));
String newpwd=StringEscapeUtiles.escapeSql(request.getParameter("newpwd"));
String sql2 = "select * from user where username="name" and password="oldpwd"";
确认用户存在且密码正确时,应用程序执行更新密码语句:
sql3="update user set password="newpwd" where username="username"";
在数据库中执行语句为:
update user set password =“111111” where username='admin'-- '
在数据库语句这种“-- ”表示注释,因此“-- ”后面的语句不会执行;最终攻击者改变的不是“admin'-- ”的密码,而是admin的密码,从而实现攻击。
以上为本人阅读相关材料并结合个人体会所写,有不当之处敬请指教。