JS

JS文件上传

文件上传
对文件上传的后缀名进行识别,可以通过PHP或者JS实现

前端JS和后端PHP的区别
JS:源代码在前端,可以使用重写前端页面来绕过
判定方法:看代码,看响应速度……
PHP:源代码在后端,只能进行黑盒测试

JS的AJAX

AJAX:一种传递数据的方式,不过还是白盒的。可以实现数据交互。

环境:前端的支付环境,登录环境–>通过修改BP包影响到整个支付流程或者修改登录标志影响登录,造成任意支付/登录漏洞
实际:将正确结果状态码替换掉错误的状态码,导致账号被盗用(验证码)

代码

前端

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Ajax登录</title>
</head>
<body>
帐号:<input type="text" class="user">
密码:<input type="password" class="pass">
<button>用户登录</button>

<script src="js/jquery-1.12.4.min.js"></script>
<script src=""></script>
<script>
$('button').click(function () {
$.ajax({
type:'post',
url:'ajax.php',
dataType:'json',
data:{
myUname:$('.user').val(),
myUpass:$('.pass').val()
},
success:function (res) {
//console.log(res);
if(res.infoCode==1){
alert('登录成功');
// 在这写后台很危险
// 假设是固定价格到前端,会出现支付逻辑漏洞
// 支付的设置,不能把价格放前端,且购买数量只能为正整数
// 进入后台的代码
}else{
alert('登录失败');

}
}
});

});





</script>

</body>
</html>

后端

<?php
$username=$_POST['myUname'];
$password=$_POST['myUpass'];
$success=array('msg'=>'ok');
if($username=='xiaodi' && $password=='123456'){
$success['infoCode'] = 1;
}else{
$success['infoCode'] = 0;
}
echo json_encode($success);

安全测试当中,拦截infocode并且更改值会返回不一样的值。要观察显示结果的决定方。例如success是返回的部分。
决定的是JS就好搞,如果还是PHP就难顶了。

看不见AJAX的情况:引入型的JS

PHP框架

ThinkePHP5

找TP框架漏洞的方法:

1.看写法
2.看历史版本漏洞(看历史漏洞实验时,漏洞没被修复才能调用)

获取版本的途径:
黑盒:看回显数据包和报错信息,还有看URL地址。插件识别等
白盒:看源码配置文件

面对框架的就是框架漏洞。ThibkPHP用户量大。

代码学习

网站访问的文件夹:publick

本地访问网站访问的路径模块部分:
application\index\Index.php
首字母必须大写

网站访问该index.php文件的一个公共类xiaodi的方法:
127.0.0.1/index.php/index/index/xiaodi
控制器 模块名 方法名

新建application\index\Test.php里面放:
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
// 继承 某模块
class Test extends Controller
{
public function index()
{
echo "I like my Wife.";
}
public function n()
{
// 接收get参数
$x = input("x");
echo "你的get传参值为:$x";
}
}

访问application\index\Test.php里面index的方法
127.0.0.1/index.php/index/test/index

访问application\index\Test.php里面n的方法且获取get参数输出
127.0.0.1/index.php/index/test/n?x=1
页面输出为:
你的get传参值为:1
对应的旧方法使用为:(当前版本好像无法使用,这是ThinkPHYP3点多版本的访问方式)
127.0.0.1/index.php?m=index&c=test&a=n

新建/application/xiaodi/controller/Xiaodi.php,配置为:
<?php
namespace app\xiaodi\controller;
use think\Controller;
use think\Db;
// 继承
class Test extends Controller
{
public function index()
{
echo "I like my Wife.";
}
public function n()
{
$x = input("x");
echo "你的get传参值为:$x";
}
}

尝试访问的方法:
127.0.0.1/index.php/xiaodi/xiaodi/index

传参学习

框架类解题思路:
1.是否按照官方的写法去写。
2.官方是否有出现过漏洞。

// 会被sql注入的写法,可以接受变动
$x = $GET['x'];
$x = input('x');

// 不会被sql注入的写法
// 按照官方写法来开发网页的话:挖程序漏洞==挖框架漏洞
$x = input('?get.x'); # 官方自带过滤器过滤掉了SQL注入
$x = input('get.x'); # 官方自带过滤器过滤掉了SQL注入

数据库配置文件位置

修改数据库的配置
application/database.php

return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'dbname',
// 用户名
'username' => 'root',
// 密码
'password' => 'password',
// 端口
'hostport' => '3306',
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 开启断线重连
'break_reconnect' => true,
];

对应的数据库操作方法:
public function edu() {
$id = (int)input("get.id");
echo $id;
$id = isset($id)?$id:1;
$data = Db::table('message_copy')->where('id', $id)->select();
if ($data){
foreach ($data as $k=>$v){
echo $v['username']."<br>";
echo $v['content']."<hr>";
}
}
}