这是基本格式
2.show_source() 函数对文件进行语法高亮显示。
高亮显示原文件如同我们看见的这样
3.include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
将config.php文件的内容复制到此文件
4. a = @ a=@ a=@_GET[‘a’];
预定义的 $_GET 变量用于收集来自 method=“get” 的表单中的值。@ 是为了防止没有 $_GET[‘a’]出现错误提示.
就是将get到的a的值赋给变量a
5.b也是一样
6.
if($a==0 and $a){
echo $flag1;
}
echo 是输出 and是与 ,所以要使输出flag变量,那么if要为真,在这里便发生了矛盾.
PHP中 字符串与数值比较时,会将字符串类型的值强制转换为数值型的0,因此当 ‘aa’ 与0做比较时其结果为true;
所以a只要不是0都满足条件
7.
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
is_numeric()用来判断是否是数字和数字字符串。如果是则返回true,如果不是则返回false。
注:会检查十进制和十六进制也就是说0x开头也会判断成数字字符串
最后,get方法的使用:在URL+?+php语句即可
在这里就是 ?a=a & b= 12345%00
Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}
综合上述,get是在URL中发送的方式,而post是在主体中发送的.
所以第一步,在URL中发送a=1的值
第二步,用post发送b的值
使用hackbar来发送,按下F12,选择hackbar插件,进行发送(hackbar插件下载安装:https://editor.csdn.net/md/?articleId=105162848))
发送完成
cyberpeace{83cfba9a9289027c4eb428ba23a1f08e}
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。
X-Forwarded-For: 本机IP, 代理1IP, 代理2IP, 代理2IP 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
综上所述,先将xff的地址改为123.123.123.123
步骤:
1.Firefox F12选择网络,刷新之后会抓取两个包,选中文件,在消息头右边有编辑重发按钮
2.输入X-Forwarded-For:123.123.123.123,点击发送
3.选择新的包,在响应下的响应载荷(payload)里面出现提示,所以refer应该是http://www.gogle.com
4.重复第一步,加入Referer:www.gogle.com注:图中是错误!
得到结果,注意:没有自动换行,需要移动界面才能看到
cyberpeace{8a90ca01145d2d5276a45125c4f9ddff}
一句话木马**** shell是密码,其他的是基本格式,使用的条件是cknife(菜刀)
步骤:
1.打开菜刀,Windows下可以直接双击打开(前提有java环境),linux下执行java -jar name.jar命令,选择添加
2.地址栏左侧填写IP地址和端口,右侧是密码这里是shell,脚本类型选择php(Eval),字符编码是GB2312,选择添加
双击地址,连接成功会直接出现文件列表,明显有一个flag.txt文件,
直接双击打开即可,
cyberpeace{8087d04e6d919be5493f9aadeeb85e06}
Cknife网盘链接:https://pan.baidu.com/s/1VYgBwBCbnO-EzsvE191LPg 提取码:szj4
ping命令的注入
通常使用截断来进行命令注入
首先随便输入一个地址
Windows下ping命令用n参数来表示数据包的个数,linux用c来表示,所以这是linux格式
用管道命令进行验证
| ls
发现输出当前目录文件,于是寻找flag文件
| find / -name flag.*(这里是肯定知道文件名为flag,所以只需要通配后缀)
得到结果,进行查看
| cat /home/flag.txt
cyberpeace{2d1f26746c55f753eb530e3dd21d04b0}
也可以使用其它截断符来得到结果
截断符:
‘$’
‘;’
‘|’
‘-’
‘(’
‘)’
‘反引号’
‘||’
‘&&’
‘&’
‘}’
‘{’
'%0a’可以当作空格来用;
1.F12查看源代码
<html>
<head>
<title>JS</title>
<script type="text/javascript">
function dechiffre(pass_enc){ /*定义函数dechiffre*/
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(','); /*55,56,54,79,115,69,114,116,107,49,50*/
var tab2 = pass.split(','); /*注意: tab!=tab2*/
var i,j,k,l=0,m,n,o,p = "";
i = 0;j = tab.length; /*j=11*/
k = j + (l) + (n=0); /*k=11*/
n = tab2.length; /*n=18*/
for(i = (o=0); i < (k = j = n); i++ ) /*for(i=0;i<18;i++)*/
{
o = tab[i-l]; /*o=tab[i] 从下一句看是多余的*/
p += String.fromCharCode((o = tab2[i]));
/*把tab2的ASCII码输出字符串 */
if(i == 5) break; /*只输出前面6个 即p=FAUX P*/
}
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]));
/*把tab的ASCII码输出字符串 后面几个 p=FAUX PASSWORD HAH*/
}
p += String.fromCharCode(tab2[17]);
/*tab2[17]是65 即A*/
pass = p;return pass;
/*此时pass的值是:FAUX PASSWORD HAHA*/
}
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"));
/*调用dechiffre函数,参数是以上十六进制字符串*/
h = window.prompt('Enter password');
alert( dechiffre(h) );
/*输出结果FAUX PASSWORD HAHA*/
</script>
</head>
</html>
2.分析
dechiffer()函数:
输入:“55,56,54,79,115,69,114,116,107,49,50” 将十六进制转为ASCII码
输出:FAUX PASSWORD HAHA
实现:无论输入的参数是多少,都存在于tab1中,而调用的始终是tab2,也就是pass的值.
3.此时flag的值是多少呢?
题目中的条件只有两个字符串,一个是限定的结果,还有一个有什么用呢,将已知参数转化成字符串
得到786OsErtk1再改成flag格式即 Cyberpeace{786OsErtk1} !!!
4.分析代码的便捷方式就是一步一输出
简化后的代码,可直接运行
<script type="text/javascript">
pass_enc="\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";
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 p="";
for(i=0;i<18;i++){
p += String.fromCharCode(tab2[i]);
document.write("第"+i+"个字符:"+tab2[i]);
document.write("
");
if(i==5)break;
}
document.write("第一个循环的结果:"+p);
document.write("
");
for(i = 0; i < 18; i++ )
{
if(i > 5 && i < 17)
{ p += String.fromCharCode(tab2[i]);
document.write("第"+i+"个字符:"+tab2[i]);
document.write("
");
}
}
document.write("此时p的值"+p);
document.write("
");
p += String.fromCharCode(tab2[17]);
document.write("tab2[17]的值"+tab2[17]);
document.write("
");
pass=p;
document.write("pass的值:"+p);
</script>