sql注入测试经验教程

时间:2016.05.06 发布人:popsummero

sql注入测试经验教程

已解决问题

谷歌popsummero用户在2016.05.06提交了关于“开讲啦sql注入测试经验教程”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-26T15:49:55。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,我不知道说什么才好,除了谢谢 !

希望以下的回答,能够帮助你。

第1个回答

用户名:rxnfutrw  

  登录注入

  先看一个我们一般用的登录页面sql语句(原生态php执行的sql)

  $sql="sel乙饭卷价选烧买述村速准ect*fromuserswhereusername='$username'andpassword='$password'";

  对于这种sql,对应一个万能密码和用户名:

  万能密码:xx'or1='1

  万能用户名:xx'unionselect*fromusers/*

  执行时mysql解释为:

  $sql=sel雨帮ect*fromuserswhereusername='$username'andpassword='xx'or1='1目条油啊指强种压船威'

  不解释,瞬间破

  同样,上面是在sql语句中查询字段后的输入值加了单引号,有些时候问答尤其是初级程序员经常对变量不加单引号:

  $sql="select*fromuserswhereusername=$usernameandpassword=$password";

  这时mysql解释会被当做数字型字段来匹配

  万能密码:11unionselec财志伟市触伯露留目矛t*fromuser压万光预之攻s/*

  执行语句:

  select*fromuserswhereusername=11unionselect*fromusers/*andpassword=54

  查询注入

  这个比较好理解,一般在页面的搜索框点击按钮搜索时在后台sql中可能会用like来查询,但如果没有加任何处理,可能输入一个%或__就会注入到sql中查询全部或部分记录,不过在php中可以使用一个函数来处理一下:

  $keyword=a还守住饭ddslashes($keyword);$keword=str_replace("%","$",$kwyword);

  插入注入

  我们先模拟一个网站注册页面相雷的sql处理语句:

  insertint何消安判院ousers(us和养矛呢硫史起ername,password果行乡衡应心村面代,grade)values('frank','123456','1');

  假如users表中grade为**字段,并且默认字段为1,注册时用户输入用户名和密码两个字段后,后台插入语句为万执皮与行话上面语句,则当用户输底式耐该硫里入的密码为123456','3')/*时,执行sql为:

  insertintousers(username,passwo分轻置响便美切细见rd,grade)values含占烈啊破石('frank','123有微456','3')/*,'1';

  这样也可期座跟报额情特验记球甲以达到注入的目的

  解决sql注入:

  ①.在服务器设置千着孙程际五应经顶将php.ini配置文件已中magic_quotes_gpc设置为On

  服务器会自动将单引号转义为:'

  不过攻击时可以将单引号写为char(13)-单引号ASCII码,也一样可以攻击

  ②.密码比对

  通过输入的用户名获取密码,再对密码进行匹配

  $sql="select*fromuserswhereusername='frank'"

  $result=mysql_query($sql,$conn);

  $row=mysql_fetch_array($result);

  if($row['password']!=$password)

  ③.使用pdo的PDO::prepare()预处理操作

  PDO(Ph**PDataObject)扩展在Ph**P5中加入,Ph**P6默认识别PDO连接**库,pdo相当于是一个**库抽象层,不同**库使用相同的方法名,解决**库连接不同意问题。

  工作原理如下:

  (使用时需先在php.ini中开启对pdo扩展的支持)

  $sql="select*fromuserswhereusername=?andpassword=?";//创建一个pdo对象$mypdo=newPDO("mysql:host=localhost;port=3306;dbname=xx","root","123456");//设置编码$mypdo->exec("setnamesutf8");//预处理$sql$pdostatement=$mypdo->prepare(%sql);//将用户名和密码填入sql$pdostatement->execute(array($username,$password));//得到查询结果$result=$pdostatement->fetch();if(empty($result))

  ④.其他企业级解决sql注入方式:IDS(入侵检测系统)

  关于sql注入对于开发工程师来说主要是防守,提高编写安全代码的意识,让我们编写的代码质量更脯安全性方面更好。