快,关注米兜Java,一起涨姿势~
热点推荐
- 深入浅出Nginx,如何做到高并发下的高效处理?如何做到热部署?
- 推荐27个Mybatis-Plus优秀案例
- foreach循环中为什么不要进行remove/add操作
- 微服务架构如何保证安全性?
SQL注入,get,post,cookie攻击怎么实战?
01前言
在讲sql注入,get,post,cookie攻击怎么实战?之前,我们先过一下SQL注入概念,然后从理论的角度简单分析一下get,post,cookie攻击,至于攻击的工具等更深入的东西只能大家各自去了解了。
sql注入(SQL Injection)_百度百科:
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)sql语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
02get|post攻击实战
以JSP+SQL Server环境为例,对于一个正常的登录表单,输入正确的账号和密码之后,JSP程序会查询数据库:如果存在此用户并且密码正确,将会成功登录;如果用户不存在或者密码不正确,则会提示账号或密码错误。
然而当输入用户名: ‘or 1=1–,密码为空时,却发现可以正常登录,显然数据库中不存在这样一个用户。
实际上,登录处最终调用代码如下:
public boolean findAdmin(Admin admin)
{
String sql = "select count(*) from admin where username='" + admin.getUsername() + "'and password='" + admin.getPassword() + "'" //SQL查询语句
try {
Resultset res = ().executQuery(sql);
//执行sql语句
i())
{
int i = res.getInt(1);//获取第一列的值
if (i>0)
{return true;} //如果结果大于0,则返回true
}
} catch (Exception e) {
e.printStackTree();//打印异常信息
}
return false;
}
上面程序段的意义很清楚:在数据库中查询username=xxx and password=xxx的结果个数。如果结果个数大于0,表示存在这样的用户,返回true,代表登录成功,否则返回false,代表登录失败。
这段代码本身没有什么错误。正常情况下,当一个用户 username='test'且password='test'时,执行了sql语句
select count(*) from admin where username = 'test' and password = 'test'
但是当输入username="'or 1=1--"时,在java程序中String类型变量sql 为
" select count(*) from admin where username = ' 'or 1=1-- ' and password = ' ' "
这句sql语句在执行时,"--" 将"and"及之后的语句都注释掉了,相当于执行了
select count(*) from admin where username = ' 'or 1=1
而1=1是永远为true的,所以该语句的执行结果实际上是admin表的行数,而不是符合输入的username和password的行数,从而顺利通过验证。
这个例子中虽然注入的过程非常简单,但可能的危害却很大。如果在用户名处输入
"' or 1=1; drop table admin --"
由于SQL Server支持多语句执行,就可以把admin表drop掉了,后果不堪设想。
03cookie攻击实战
Cookie注入简单来说就是利用Cookie而发起的注入攻击。从本质上来讲,Cookie注入与传统的SQL注入并无不同,两者都是针对数据库的注入,只是表现形式上略有不同罢了。
要想深入了解Cookie注入的成因,必须要了解ASP脚本中的request对象。它被用来获取客户端提交的数据。先来看下ASP开发文档中对request对象的描述,如图1所示:
Request对象的使用方法一般是这样的:request.[集合名称](参数名称),比如获取从表单中提交的数据时可以这样写:reque("参数名称"),但ASP中规定也可以省略集合名称,直接用这样的方式获取数据:request("参数名称"),当使用这样的方式获取数据时,ASP规定是按QueryString、Form、Cookies、ServerVariables的顺序来获取数据的。这样,当我们使用request("参数名称")方式获取客户端提交的数据,并且没有对使用reque("参数名称")方式提交的数据进行过滤时,Cookie注入就产生了。
Cookie注入典型步骤
上面我们介绍了Cookie注入的相关知识,下面我们来看如何确定一个网站是否存在Cookie注入漏洞。
1.寻找形如“.asp?id=xx”类的带参数的URL。
2.去掉“id=xx”查看页面显示是否正常,如果不正常,说明参数在数据传递中是直接起作用的。
3.清空浏览器地址栏,输入“javascript:aler;id="+escape("xx"));”,按Enter键后弹出一个对话框,内容是“id=xx”,然后用原来的URL刷新页面,如果显示正常,说明应用是用Request("id")这种方式获取数据的。
4.重复上面的步骤,将常规SQL注入中的判断语句带入上面的URL:“javascript:aler;id="+escape("xx and 1=1"));”
“javascript:aler;id="+escape("xx and 1=2"));”。
和常规SQL注入一样,如果分别返回正常和不正常页面,则说明该应用存在注入漏洞,并可以进行cookie注入。
5.使用常规注入语句进行注入即可。
具体案例我就不举例了,好像网上都有。
04攻击工具
- Havij
- Pangolin
- SQLmap
具体怎么玩,自行了解即可。
05注入总结
上面我们以攻击者的视角简单讲述了SQL注入攻击,但我们的目的不是为了去攻击别人,而且为了更好的防御。俗话说“知己知彼,百战不殆”,只有理解了攻击者是如何攻击的,我们才能更有效地防御。
请留下你指尖的温度
让太阳拥抱你
记得这是一个有温度的头条号
print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
Sy("点个好看吧!");
con("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Con("点个好看吧!");
("点个好看吧!");
Re("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"