[ctf零基础入门]php基础

ctf学习 专栏收录该内容
11 篇文章 0 订阅

本文难度简单,适合完全0基础
整理该笔记时,作者完全0基础自学1个月在备考单位考试,水平有限时间紧张,如有错误和不足,请指教。

工具安装:
phpstudy、
java->burpsuite和(或)火狐及hackbar
可以安装-sublime编辑器
我的测试环境是win10 64 phpstudy 8.1
吾爱破解的破解版Burpsuite+1.7.26Cn
(因为新出的BurpSuitev2.5.0.2 需要装新旧两版java我时间紧就没用它)

入门基础

Php基本语法:
https://www.w3school.com.cn/php/php_syntax.asp
先快速自学,遇到问题,请教百度

php要求
1、文件后缀必须为php
2、文件开头必须是 <?php 文件结束:?>
3、变量的声明必须添加 $
4、每一行代码后都要添加;来结束。

变量的要求
1、变量以 $ 符号开始,后面跟着变量的名称
2、变量名必须以字母或者下划线字符开始
3、变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
4、变量名不能包含空格
5、变量名是区分大小写的($y 和 $Y 是两个不同的变量
超全局变量
https://www.php.net/manual/zh/language.variables.superglobals.php
PHP中预定义了几个超级全局变(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 不需要特别说明,就可以在函数及类中使用。PHP 超级全局变量列表:
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
 $_SERVER 服务器环境变量数组,由 Web 服务器创建,是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
$_POST 通过POST方法传递给脚本的变量数组
$_GET 通过GET方法传递给脚本的变量数组
$_COOKIE cookie 变量数组
$_REQUEST所有用户输入的变量数组包含了 $_GET,$_POST 和 $_COOKIE 所包含的输入内容
 $_FILES 与文件上传相关的变量数组
 $_ENV 环境变量数组
 $_SESSION 会话变量数组

题目:http://123.206.87.240:8004/index1.php
源码:

<?php  
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
    $args = $_GET['args'];
    if(!preg_match("/^\w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");
}
?>

?args=GLOBALS

弱类型

对于0基础新手建议下面设计到代码和语句的地方,都手动敲代码在电脑上测试下
如果一个字符串为 “合法数字+e+合法数字”类型,将会解释为科学计数法的浮点数
如果一个字符串为 “合法数字+ 不可解释为合法数字的字符串”类型,将会被转换为该合法数字的值,后面的字符串将会被丢弃
如果一个字符串为“不可解释为合法数字的字符串+任意”类型,则被转换为0!

1 <?php
2 var_dump("admin"==0);  //true
3 var_dump("1admin"==1); //true
4 var_dump("admin1"==1) //false
5 var_dump("admin1"==0) //true
6 var_dump("0e123456"=="0e4456789"); //true 

常见弱类型:
md5()

  <?php
  if (isset($_GET['Username']) && isset($_GET['password'])) {
      $logined = true;
      $Username = $_GET['Username'];
      $password = $_GET['password'];
  
       if (!ctype_alpha($Username)) {$logined = false;}
       if (!is_numeric($password) ) {$logined = false;}
       if (md5($Username) != md5($password)) {$logined = false;}
      if ($logined){
     echo "successful";
       }else{
            echo "login failed!";
         }
     }

MD5 0e开头会被当成0
常见md5 0e开头:
QNKCDZO
240610708
s878926199a
s155964671a
数组无法比较
构造payload:
?Username=QNKCDZO&password=240610708

strcmp()
数组可以绕过,要求较低php版本php -v <5.3

$password="*";
$a = array();
if (strcmp($a, $password) == 0) {
echo "Right!!!login success";
exit();
} else {
echo "Wrong password..";
}

is_array
is_array() 函数用于检测变量是否是一个数组

array_search
下面是官方手册对array_search的介绍,

mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )

n e e d l e , needle, needlehaystack必需, s t r i c t 可 选 函 数 判 断 strict可选 函数判断 stricthaystack中的值是存在$needle,存在则返回该值的键值 第三个参数默认为false,如果设置为true则会进行严格过滤, 所以,array_search()在没有选择第三个参数时,是一个弱类型比较, 0==任意字符串
preg_match 和preg_match_all 函数的参数如果是数组的话则返回false,这样就可以绕过正则的过滤。

变量覆盖

extract() 变量覆盖

<?php
$a=0;
extract($_GET);
if($a==1)
	echo "flag";
else
	echo "no";

?a=1
import_request_variables 变量覆盖
bool import_request_variables (string $types [, string $prefix])
import_request_variables 将 GET、POST、Cookies 中的变量导入到全局,使用这个函数只用简单地指定类型即可。可以用字母’G’、‘P’和’C’分别表示 GET、POST 和 Cookie。这些字母不区分大小写,所以你可以使用’g’、'p’和’c’的任何组合。

<?php
$a=0;
import_request_variables("G");
if($a==1)
	echo "flag";
else
	echo "no";

这里指定G,所以用get传参
?a=1
parse_str() 变量覆盖

void parse_str ( string $str [, array &$arr ])

parse_str() 函数通常用于解析 URL 中的 querystring,但是当参数值可以被用户控制时,很可能导致变量覆盖。
下面是官方文档的内容
Parse_str()
如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置

到该数组里 )。
// 推荐用法
parse_str($str, $output);
//不推荐用法
parse_str($str);
会产生变量覆盖风险
<?php 
highlight_file(__FILE__); 
//var.php?var=new   
$var='init';   
parse_str($_SERVER['QUERY_STRING']);   
print $var; 

?>

0基础可以先掌握这么多,php代码稍微熟悉的,可以看看:
php基础,弱类型和变量覆盖

mysql

mysql基础

安装phpstudy 我的版本:8.1
操作系统win10 64位
在这里插入图片描述
找到mysql文件所在位置,进入bin
打开系统自带的powershell,输入
./mysql -u root -p
输入密码进入
win7 输入mysql -u root -p进入
也可以添加环境变量,这样可以不用再mysql/bin 进入

Mysql语句
Show databases;
创建数据库:
mysql> create DATABASE mydb;
drop database <数据库名>;//删除数据库

Use mydb;
Show tables;
CREATE TABLE table_name (column_name column_type);//创建表

mysql> CREATE TABLE tb_emp1
    -> (
    -> id INT(11),
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT
-> );

可以自己尝试创建一个列名为“(runoob_title, runoob_author, submission_date”的runoob_tbl表

Desc 表名 看表的信息
DROP TABLE table_name ;//删除表
ALTER TABLE tb_emp1 ADD age INT(4);//增加一列
alter table tb_emp1 drop column age;//删除一列

插入数据:

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

insert into tb_emp1(id,name,deptld) values (1,"zhangsan",124);
或者
mysql> INSERT INTO runoob_tbl
    -> (runoob_title, runoob_author, submission_date)
    -> VALUES
    -> ("JAVA 教程", "RUNOOB.COM", '2016-05-06');

查询数据:
SELECT field1, FROM table_name1 [WHERE condition1 [AND [OR]] condition2…
select * from user order by 3 判断几列 使用union select

修改
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
mysql> UPDATE runoob_tbl SET runoob_title=‘学习 C++’ WHERE runoob_id=3;

其他备用命令:
重命名
ALTER TABLE <旧表名> RENAME [TO] <新表名>;

php连接mysql

前提:搭建好phpstudy或者其他 wamp或者lamp软件
用前面的知识mydb数据库,建立了名为user的表
在这里插入图片描述
数据库连接

<?php
$con=mysql_connect("localhost","root","密码");//输入你设置的mysql密码默认是root
if(!$con)
{
	die("error!".mysql_error());
}else{
	echo "ok!";
}
?>

运行结果:
在这里插入图片描述
查询数据:

<?php
$con=mysql_connect("localhost","root","*");
if(!$con)
{
	die("error!".mysql_error());
}
mysql_select_db("mydb");
$id=$_GET['id'];
$sql="select * from user";
//$sql="select * from user where id='$id'";
$re=mysql_query($sql);
while($row=mysql_fetch_assoc($re)){
	echo "user:".$row['username']."	pass:".$row['password'];
	echo "<br />";
	// echo "<pre>";
	// print_r($row);
	// echo "</pre>";

}
	mysql_close($con) or die(mysql_error($con));  
?>

比较丑陋,用//的比较好看点
有是时间可以在问w3 school把 mysql的增删改都对照着查都敲下
https://www.w3school.com.cn/php/php_mysql_intro.asp
这个网页可以尝试做sql注入的一些测试

  • 0
    点赞
  • 0
    评论
  • 7
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

_小飒

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值