2019-10-24:伪静态,VULHUB搭建靶场,宽字节sql注入,笔记

伪静态
1,需要开启站点的重写机制,需要修改配httpd配置文件,将LoadModule rewrite_module modules/mod_rewrite.so注释取消,需要apache支持解析.htaccess文件,找到 AllowOverride None修改为 AllowOverride ALL,重启apache
2,新建.htaccess文件,然后写入“重写规则”,
RewriteEngine on //开启重写机制
RewriteRule ([0-9]{1,})\.html$ index.php?id=$1//重写规则,([0-9]{1,})$匹配$1的值,\是转义符,html$表示Url中以html结尾
RewriteRule ([0-9]{1,}-[a-zA-Z]{1,})\.html$ index.php?id=$1&para=$2

VULHUB搭建靶场
Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。
https://github.com/vulhub/vulhub
https://vulhub.org/#/environments/

1,需要安装pip,是python的用来管理工具包的工具,安装compose,pip install docker-compose
2,下载vulhub,wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip, 解压 unzip vulhub-master.zip,进入cd vulhub-master
3,启动vulhub,进入某一个漏洞/环境的目录 cd tomcat/CVE-2017-12615,之后启动整个环境docker-compose up -d,移除环境docker-compose down -v,在哪个目录启动就在哪个目录移除
运行起来的环境的端口,docker ps
pip install docker-compose下载安装好docker-compose会报错ImportError: No module named ssl_match_hostname,找不到模块ssl_match_hostname,安装会提示有最新的了,解决方法
复制模块到包路径下
#进入backports模块路径
cd /usr/local/lib/python2.7/dist-packages
#复制整个包到transport包路径下
cp -r backports /usr/local/lib/python2.7/dist-packages/docker/transport

宽字节sql注入
mysqli_query("SET NAMES 'utf8'"); 设置查询结果的字符集编码
mysqli_set_charset("utf8"); 设置存的时候的字符编码
mysqli_real_escape_string(),对参数进行过滤转义,基友类似功能的函数有,addslaches()
mysql_escape_string(php 5.3之后移除了),
魔术引号(magic_quotes_gpc模块)

特殊符号有',",\,null,<,>,等进行转义
gbk编码,针对汉字的一种编码方式,使用两个字节编码一个汉字

如果程序的默认字符集是GBK等宽字节字符集,就有可能产生宽字节注入,绕过上述过滤。
若在 PHP 中使用mysql_query("set names gbk")将默认字符集设为GBK,而使用addslashes()转义用户输入,这时如果用户输入%bb%27,则addslashes()会在%27前面加上一个%5c字符,即转义字符\。
而 MySQL 在使用GBK编码时,会认为两个字符为一个汉字,%bb%5c是一个宽字符(前一个 ASCII 码大于 128 才能到汉字的范围),也就是籠,也就是说%bb%5c%27=籠',这样单引号就未被转义能闭合语句,从而产生 SQL 注入。%bb并不是唯一一个可以产生宽字节注入的字符,理论上%81-%FE均可。
过滤\'中的\
构造%bb%5c%5c%27,addslashes()会在两个%5c和%27前都加上\即%5c,变为%bb %5c%5c %5c%5c %5c%27,但宽字符集认为%bb%5c是一个字符即籠,则变为%bb%5c %5c%5c %5c%5c %27即籠\\\\',四个\正好转义为两个\,即'未被转义。这也是 bypass 的一种方法。

测试步骤
1,访问站点,查看返回结果,http://127.0.0.1/gbksql/01/?id=1' 查看返回结果,SELECT * FROM news WHERE tid='1\''
2,http://127.0.0.1/gbksql/01/?id=1%df',高位在81以后就能用,81-fe,1%df--->1df5c-->1運',引号出来就闭合了,就可以使用语句注入了

PDO:连接数据库-->设置模版-->绑定数据-->执行sql语句
PDO prepare参数化语句,可以解决sql注入语句的原理 https://www.jianshu.com/p/c0deb8061718

二次编码注入
浏览器会对from表单中数据进行依次url解码,到达服务器之后会默认解码
php中url解码函数有,urldecode(),rawurldecode()两个函数

头部注入
x-forwarded-for:简称xff头,它代表客户端,也就是HTTP的请求端真实的Ip,通常一些网站的防注入功能会记录请求端真实Ip地址并写入数据库or某文件

posted @ 2019-10-24 18:25  bonga  阅读(500)  评论(0编辑  收藏  举报