前言
记录一下学习过程
提示:以下是本篇文章正文内容,下面案例可供参考
7.simple_php
分析php的代码,发现以get方式获取数据。
<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
- 第一个
$flag1
:php是弱类型语言,在用==
比较的时候,不同类型的值比较会被转化比较,比较规则如下
字符串转数字
1. 字符串的开始部分决定了它的数字值。
2. 如果该字符串以合法的数字值开始,则使用该数值。否则其值为 0(零)。
3. 合法数字值可以是正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。
- 所以只需要输入非数值型的字符即可显示第一个
$flag
。使用===
就会严格比较类型。 - 第二个
flag2
:is_numeric()
:指定的变量是数字和数字字符串则返回 TRUE;所以输入一个比1234大的字符串
http://111.200.241.244:57651/?a=asdf&b=12345112a
9.xff和referer
xff:X-Forwarded-For: HTTP 扩展头部,主要作用是查看源ip以及代理ip
格式:X-Forwarded-For: client, proxy1, proxy2
referer:主要是网页的来源地址,服务器使用referer确认访问来源,如果referer内容不符合要求,服务器可以拦截或者重定向请求。
格式: Referer=http://www.google.com
使用bp抓包 添加进ip为123.123.123.123 和referer来源为google
返回出flag
cyberpeace{49adab36ff04a945a1578da05c09aba1}
10.webshell
点开进去上面显示一句话木马
一句话木马:通过post上传的的参数shell以php语法进行执行。
1.直接上菜刀
既然有一句话木马最方便的方法自然是直接上菜刀
2.手动测试连接
首先通过返回包,查看服务器的操作系统为ubuntu
以post参数提交命令ls 查看一下当前目录,发现恰好有flag.txt文件,system()函数调用/bin/sh来执行参数指定的命令
直接查看 flag文件获得flag
或者直接find一下 找到文件
shell=system('find / -name "flag.*" ');
11.command_execution
先简单的使用一下ping命令 发现能正常使用,而且没有waf说明没有参数的过滤,任何玩意都能写到框框里面去。
直接拼接语句查找flag
查看flag
127.0.0.1&&cat home/flag.txt
12.simple_js
怎么输入发现都是一个结果,FAUX PASSWORD HAHA。查看网页的代码,发现输入进去的pass_enc
根本就没被用到,自始至终都是pass在用。
<html>
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
</script>
</head>
</html>
中间的这段代码 看似花里胡哨 实际上就是变成ascll码后拼接输出
var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
直接用python输出两个数组的值
a="\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"
b=a.split(',')
c="70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65" #pass数组
c=c.split(',')
# 输出a数组的ascll
for i in b:
print(chr(int(i)),end='')
print('')
# 输出pass数组的ascll
for i in c:
print(chr(int(i)),end='')
输出
786OsErtk12
FAUX PASSWORD HAHA
所以flag为 786OsErtk12
总结
主要涉及的知识点:
php的语言比较特点
xff和referer的定义和UA头的参数
一句话木马的原理
命令的直接拼接
js代码的简单理解