当前位置:   article > 正文

SQL注入---HTTP报头注入

SQL注入---HTTP报头注入

文章目录


        前文中提到万能密钥的工作原理,然而万能密钥仅在源代码中没有代码审计,此时才被称之为万能密钥,而代码中有代码审计时需要分以下几种情况讨论

一.uagent注入

       先看代码:

  1. <?php
  2. #提供用于连接数据库的信息(账号密码等)
  3. include("../sql-connections/sql-connect.php");
  4. error_reporting(0);
  5. function check_input($value)
  6. {
  7. #判断括号中的值是否为空
  8. if(!empty($value))
  9. {
  10. #使用substr()函数截取变量的前20个内容
  11. $value = substr($value,0,20);
  12. }
  13. if (get_magic_quotes_gpc())
  14. {
  15. $value = stripslashes($value);
  16. }
  17. #使用ctype_digit()检查变量是否全部为数字
  18. if (!ctype_digit($value))
  19. {
  20. #若不全是数字使用mysql_real_escape_string()转译变量中的特殊字符
  21. #是原先的符号实体化如单引号不再具有闭合的效果
  22. $value = "'" . mysql_real_escape_string($value) . "'";
  23. }
  24. else
  25. {
  26. $value = intval($value);
  27. }
  28. return $value;
  29. }
  30. #使用php内置函数$_SERVER[]提取http报文中的信息
  31. $uagent = $_SERVER['HTTP_USER_AGENT'];
  32. $IP = $_SERVER['REMOTE_ADDR'];
  33. echo "<br>";
  34. echo 'Your IP ADDRESS is: ' .$IP;
  35. echo "<br>";
  36. #使用isset()函数判断变量是否为空
  37. if(isset($_POST['uname']) && isset($_POST['passwd']))
  38. {
  39. #使用自定义函数check_input()检查使用post方式传递的账户+密码
  40. $uname = check_input($_POST['uname']);
  41. $passwd = check_input($_POST['passwd']);
  42. $fp=fopen('result.txt','a');
  43. fwrite($fp,'User Agent:'.$uname."\n");
  44. fclose($fp);
  45. $sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
  46. #使用mysql_query()将参数放入到数据库中执行
  47. $result1 = mysql_query($sql);
  48. $row1 = mysql_fetch_array($result1);
  49. if($row1)
  50. {
  51. echo '<font color= "#FFFF00" font size = 3 >';
  52. #将查询到的数据uagent,IP,uname插入数据库security中的表uagents的列uagent,ip_address,username
  53. $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
  54. mysql_query($insert);
  55. echo "</font>";
  56. echo 'Your User Agent is: ' .$uagent;
  57. echo "</font>";
  58. echo "<br>";
  59. print_r(mysql_error());
  60. echo "<br><br>";
  61. echo "<br>";
  62. }
  63. }
  64. ?>

了解完上述代码后发现,uagent没有相应的审计代码防止SQL注入,因此可以使用uagent进行注入。

演示案例:

注入工具:Burp Suite

 报文修改前

报文修改后:

当修改后的报文被发送到服务器后会执行对应的程序,代码如下:

  1. $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`)
  2. VALUES
  3. ('1' or updatexml(1,concat('~',(select database())),3)', 2, 3) #,'$IP',$uname";

二.refeer注入

 refeer注入和useagent的区别如下:

$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";

报文修改前:
 报文修改后:

三.Cookie注入 

  1. $sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
  2. $result1 = mysql_query($sql);
  3. #使用mysql_fetch_array()将result1转换为数组
  4. $row1 = mysql_fetch_array($result1);
  5. #提取row1中的username值并赋值给cookee
  6. $cookee = $row1['username'];
  7. if($row1)
  8. {
  9. setcookie('uname', $cookee, time()+3600);
  10. }
  11. #生成cookie后
  12. if(!isset($_POST['submit']))
  13. {
  14. $cookee = $_COOKIE['uname'];
  15. echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);
  16. }
  17. $sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
  18. #利用sql语句是否执行成功判断输入的用户名是否等于cookie
  19. $result=mysql_query($sql);
  20. if (!$result)
  21. {
  22. die('Issue with your mysql: ' . mysql_error());
  23. }

修改前: 

 修改后:


总结

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/413656
推荐阅读
相关标签
  

闽ICP备14008679号