1.这一题跟前面的题型都不同,无论在username 跟 password 输入什么都会失败,但是前端却始终显示着你的IP地址。查看后端代码发现是对表单输入的参数进行了过滤
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
2.这里我推测可以使用http头注入,关于http请求头的一些参数
这里列出几个常用请求头:
- Host
Host请求报头域主要用于指定被请求资源的Internet主机和端口号。
如:Host: localhost:8088 - User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。登录一些网站时,很多时候都可以见到显示我们的浏览器、系统信息,这些都是此头的作用。
如:User-Agent: Mozilla/5.0 - Referer
Referer包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面。
如:Referer: http://localhost:8088/sqlilabs/Less-18/ - Cookie
Cookie是非常重要的请求头,它是一段文本,常用来表示请求者身份等。
如:Cookie: username=admin; password=admin - Range
Range可以请求实体的部分内容,多线程下载一定会用到此请求头。
如:表示头500字节:Range: bytes=0~499
表示第二个500字节:Range: bytes=500~999
表示最后500字节:Range: bytes=-500
表示500字节以后的范围:Range: bytes=500- - X-Forwarded-For
X-Forwarded-For即XXF头,它代表请求端的IP,可以有多个,中间以逗号隔开。
如:X-Forwarded-For: 8.8.8.8 - Accept
Accept请求报头域用于指定客户端接收哪些MIME类型的信息。
如:Accept: text/html - Accept-Charset
Accept-Charset请求报头域用于指定客户端接收的字符集。如果在请求消息中没有设置这个域,默认是任何字符集都可以接收。
如: Accept-Charset: gb2312
3.由于需要修改http请求包,所以我使用burpsuite进行测试。
捕捉到请求包后发送到重放攻击模块
4.既然页面显示了我的ip,一开始我推测是XFF注入,但是抓包后发现没有使用XFF,这就有点摸不着头了,username 跟password 做了输入过滤,没办法在那里注入。
原来后端是使用 REMOTE_ADDR 直接根据TCP协议数据包的底层会话IP地址 获取我的ip地址。
$uagent = $_SERVER['HTTP_USER_AGENT'];
$IP = $_SERVER['REMOTE_ADDR'];
实在没辙那我登录一个弱口令账号 admin admin 上去看下
发现登录成功后页面显示了我的ip,和user-agent
根据我的推测,系统因该是把用户每次登录的IP 跟user-agent保存了下来。这让我想起了一句经典名言”有数据交互的地方就有注入“,那么我们可以尝试在请求包的user-agent里面做文章,
当我在user-agent的后面加了个单引号后,果然报错了
那既然有报错,那就肯定有sql注入,这里我们根据以往的经验可以使用报错注入的方法。
这是后端把数据记录到数据库中的代码:
INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname);
通过这段sql语句我们可以构造注入payload,在user-agent里面添加payload
' and updatexml(1,concat(">",database(),"<"),1))#
成功使用报错注入获取了数据库名
后面的一些查表查字段的操作可以参考之前的