深入分析SQL注入在 NET应用程序
1.准备工具:SQL SERVER,Visual Studio
2.数据库脚本和。net代码(c#)
3.SqlServer事件探查器
SQL脚本代码:
使用MASTER GO -检索是否存在于sqltmp数据库中(从sysdatabases中选择*其中name=' SQLTMP ')-删除SQLTMP数据库DROP DATABASE SQLTMPGO -创建数据库SQLTMPGO -使用SQLTMP数据库使用SQLTMPGO -创建一个表来验证SQL注入漏洞-检索表中是否存在IF EXI。STS(从sysobjects中选择*其中name=' admin ')-删除表DROP TABLE adminGO -创建表create table admin (id int主键标识(1,1),-设置主键namevarchar (20)不为空,-用户名passvarchar (20)不为空-密码)-插入一段测试数据。admin’)-查询插入数据SELECT * FROM admin这里有一个C#代码:来验证用户名和密码
font size='3' color='#ff00ff '使用System使用系统。集合。通用;使用系统。Linq使用系统。文字;使用系统。线程化。任务;使用系统。数据;使用系统。Data . SqlClient命名空间sqltmp { class program }//数据库连接字符串公共静态字符串strcon='数据源=。初始目录=SQLTMP集成安全性=真';//创建数据库连接对象static sqlconnection sqlcon=new sqlconnection(strcon);静态void main (string [] args) {console。writeline('请输入用户名: ');字符串名称=控制台。ReadLine();控制台。WriteLine('请输入密码: ');字符串传递=控制台。ReadLine();尝试{ Program p=new Program();//打开数据库连接p . Open();字符串SQL=' SELECT COUNT(*)FROM admin WHERE name=' name ' ' AND pass=' pass ' ';SqlCommand sqlcom=new Sqlcommand(SqL,Sqlcon);int i=(int)sqlcom。execute scalar();if(I 0){控制台。WriteLine('登录成功!' );}else{Console。WriteLine('登录失败!' );}控制台。ReadLine();}catch(异常){ throw}最后{//关闭数据库连接通道。clone();} }//打开数据库连接public void Open(){//打开数据库连接if(sqlcon . state==connectionstate . closed){ sqlcon . Open();}//如果(sqlcon . state==connectionstate . break){//关闭SqlCon,则打开数据库连接。close();SqlCon。open();} }//关闭数据库连接public void close(){ if(sqlcon . state==connectionstate . open | | sqlcon . state==connectionstate . break){ sqlcon . close();}}}}/font我们来测试一下
输入正确的帐户密码:
管理管理员
登录成功
输入错误的帐户密码:
测试测试
登录失败
我们输入: '或1=1-
密码:123
你会发现你可以成功登录!
数据库中没有该账号的密码,登录成功?
为什么呢?
0x03分析
让我们分析一下SQL语句的运行过程
使用我的SQL语句跟踪工具(SQL Server Profiler)
点击链接
奔跑
让我们看一下输入正确帐户密码的SQL语句
在我们的SQL Server中运行它,就有了合格的数据
我们来看看输入错误账号密码的SQL语句的样子
在我们的SQL Server中运行,没有合格的数据
让我们看一下上次输入的帐户密码的SQL语句
让我们看一下图片中的SQL语句,并比较我们上面的SQL语句
font size=' 3 ' color=' # ff 00 ff ' select COUNT(*)FROM SQLTMP WHERE name=' admin ' AND pass=' admin ' select COUNT(*)FROM SQLTMP WHERE name=' or 1=1-' AND pass=' 123 '/font,我们会发现我们输入的用户名变成了空的,还有more或1=1-'这是为什么,是什么原因造成的?
当我们离开这里的时候,我们应该看看这个代码:
font size=' 3 ' color=' # ff 00 ff ' string SQL=' SELECT COUNT(*)FROM admin WHERE name=' name ' ' AND pass=' pass ' ';/font我们可以看到,SQL中的name和pass变量是用户输入的账号和密码
让我们看看输入的用户名: '或1=1 -
然后用户输入时会自动关闭名称=' '
或者1=1将始终保持where条件
-在SQL中,是注释的意思,下面的SQL语句会被注释!
那么我们可以认为SQL语句最终是这样的
Font size=' 3' color=' # ff00ff '从sqltmp中选择count (*),其中name=' '或1=1/font0x04 defense
进攻的方式就是防守的方式
据我所知,常用的方法有两种:
1.通过SQLParameter
好处:预编译的SQL语句防止被翻译
用法:
font size=' 3 ' color=' # ff 00 ff ' string SQL=' SELECT COUNT(*)FROM admin WHERE name=[URL=home . PHP?mod=space uid=116087]@ name[/URL]AND pass=@ pass ';//创建saparameter[]sqlparameter[]para={ new sqlparameter(' @ name ',name),new sqlparameter ('@ pass ',pass)};SqlCommand sqlcom=new Sqlcommand(SqL,Sqlcon);//将para[]放入sqlcom。Parameters.addRange (para)通过Parameters.addRange方法;int i=(int)sqlcom。execute scalar();/font@符号代表参数,我们把拼接方式改成了参数的形式
2.存储过程
1.首先在数据库中创建一个存储过程
Font size=' 3' color=' # ff00ff '创建proc登录名(@ name varchar (20),@ pass varchar (20))作为从admin中选择count (*),其中name [email protected]和pass=@ pass go/font2。调用存储过程
font size=' 3 ' color=' # ff 00 ff ' SqlParameter[]para={ new SqlParameter(' @ name ',name),new SqlParameter('@pass ',pass)};SqlCommand sqlcom=new SqlCommand();sqlcom。Connection=SqlConsqlcom。命令文本=“登录”;//指定执行类型为存储过程sqlcom.command type=command type . storedprocedure;sqlcom。参数。添加范围(第段);int i=(int)sqlcom。execute scalar();/font
好的,我将把你介绍给SQL注入。NET应用程序,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!
版权声明:深入分析SQL注入在 NET应用程序是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。