lua安装:
[root@localhost ~]# yum -y install lua
lua的使用:
[root@localhost ~]# lua
Lua 5.1.4 Copyright © 1994-2008 Lua.org, PUC-Rio
print “hello world”
hello world
这种不方便,我们可以把它写在文件里执行:
[root@localhost ~]# which lua
/usr/bin/lua
[root@localhost ~]# vim test.lua
添加:
#!/usr/bin/lua
print("hello world")
[root@localhost ~]# lua test.lua
hello world
lua的注释语法:
基本注释:
–注释内容
范围注释:
–[[
注释内容
–]]
例:
#!/usr/bin/lua
–你好
–[[
test
–]]
print(“hello world”)
[root@localhost ~]# lua test.lua
hello world
Lua变量定义及调用:
#!/usr/bin/lua
–你好
–[[
test
–]]
a = 123
print(a)
print(“test:”,a)
[root@localhost ~]# lua test.lua
123
test: 123
#lua的布尔类型只有nil(空,零)和false,布尔类型就是真和假,也就是true和false.
#数字0,空字符串都是true
#lua的变量全是全局变量
更多的lua操作这里不再说啦。什么while循环,if判断什么的。
Nginx加载Lua环境:
默认情况下nginx不支持Lua模块,需要安装LuaJIT解释器,并且需要重新编译Nginx。 也可以使用春哥开发的openrestry,加载这个非常简单。
我们先来加载Lua:(我这里早已经安装完Nginx,所以重新编译添加模块即可)
下载Luajit和ngx_devel_kit和Lua-nginx-module
[root@localhost ~]# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
[root@localhost ~]# wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
[root@localhost ~]# wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
解压ngx_devel_kit与Lua-nginx-module:
[root@localhost ~]# tar -zxvf v0.2.19.tar.gz -C /usr/src/
[root@localhost ~]# tar -zxvf v0.10.13.tar.gz -C /usr/src/
安装Luajit:
[root@localhost ~]# cd /usr/src/LuaJIT-2.0.4/
[root@localhost LuaJIT-2.0.4]# make && make install
...............
==== Successfully installed LuaJIT 2.0.4 to /usr/local ==== #成功后有Successfully
[root@localhost ~]# echo "/usr/local/lib" >> /etc/ld.so.conf
[root@localhost ~]# ldconfig
因为我这里已经安装过nginx了,所以只需添加模块就可以,无需重新编译安装(如果未安装直接编译安装即可,与以下预编译参数一致即可):
[root@localhost ~]# nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module
#复制以上预编译参数:
[root@localhost ~]# cd /usr/src/nginx-1.10.3/
[root@localhost nginx-1.10.3]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --add-module=../ngx_devel_kit-0.2.19 --add-module=../lua-nginx-module-0.10.13 #添加这两个新参数,这两个模块为我们要添加的模块ngx_devel_kit与Lua-nginx-module
[root@localhost nginx-1.10.3]# make
[root@localhost nginx-1.10.3]# cp objs/nginx /usr/local/nginx/sbin/nginx #覆盖
[root@localhost nginx-1.10.3]# rm -rf /usr/bin/nginx #删除之前的软连接
[root@localhost nginx-1.10.3]# ln -s /usr/local/nginx/sbin/* /usr/bin/ #做新的软连接
验证是否成功加载lua模块:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location /test {
default_type text/html;
content_by_lua_block {
ngx.say("hello world")
}
}
#成功
#也可以部署openrestry,这个比较简单,Lua和openrestry二选一。这里不写openrestry部署啦
nginx+lua实现waf防火墙:
随着网络的发展,安全也成为啦非常重要的一方面。网络有许多的攻击手段,例如爬虫、sql注入等。
搭建lnmp模拟sql注入,这里已经有nginx+lua环境啦,我们安装mysql与php即可。我这里使用Yum安装。(需要用到网络源)
[root@localhost ~]# yum -y install mariadb mariadb-server php php-fpm php-mysql
location / {
root html;
index index.html index.php;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
[root@localhost ~]# systemctl start php-fpm
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# nginx -s reload
[root@localhost ~]# vim /usr/local/nginx/html/index.php
添加:
<?php
phpinfo();
?>
访问验证即可。
配置mysql:
mysqladmin -uroot password 123.com
进入数据库
MariaDB [(none)]> create database info;
MariaDB [(none)]> use info;
MariaDB [info]> create table user(id int,username varchar(64),password varchar(64),email varchar(64));
MariaDB [info]> insert into user values(1,'zs',('123'),'[email protected]');
Query OK, 1 row affected (0.00 sec)
MariaDB [info]> insert into user values(2,'ww',('456'),'[email protected]');
Query OK, 1 row affected (0.00 sec)
编写文件,为sql注入做准备:
[root@localhost ~]# vi /usr/local/nginx/html/login.html
添加:
<html>
<head>
<title> 测试Sql注入 </title>
<meta http-equiv="content-type"content="text/html;charset=utf-8">
</head>
<body>
<form action="sql.php" method="post">
<table>
<tr>
<td> 用户: </td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td> 密码: </td>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
[root@localhost ~]# vi /usr/local/nginx/html/sql.php
添加:
<?php
$conn = mysql_connect("localhost",'root','123.com') or die("数据库连接失败! ");
mysql_select_db("info",$conn) or die ("您选择的数据库不存在");
$name=$_POST['username'];
$pwd=$_POST['password'];
$sql="select * from user where username='$name' and password='$pwd'";
echo $sql."
";
$query=mysql_query($sql);
$arr=mysql_fetch_array($query);
if($arr) {
echo "login success!
";
echo $arr[1];
echo $arr[3]."
";
}else{
echo "login failed!";
}
?>
浏览器访问login.html验证:
在用户那块填写’ or 1=1#’ 提交
为啦防止sql注入,我们用nginx+lua部署waf防火墙:
[root@localhost ~]# yum -y install git
[root@localhost ~]# git clone https://github.com/Loveshell/ngx_lua_waf.git
[root@localhost ~]# cp -r ngx_lua_waf/ /usr/local/nginx/conf/waf
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
在http标签内添加: #路径一定要对应上面的waf路径
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
[root@localhost ~]# nginx -s reload
[root@localhost ~]# vim /usr/local/nginx/conf/waf/config.lua
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
[root@localhost ~]# vim /usr/local/nginx/conf/waf/wafconf/post
在第一行添加:
\sor\s+
再次进行sql注入测试:
我克隆过来的waf策略它默认的策略基本够使用了。
配置waf防止cc攻击:
[root@localhost ~]# vim /usr/local/nginx/conf/waf/config.lua
CCDeny="on" #将此选项打开
CCrate="600/60" #配置同个ip每60秒最多发送600次请求,超过之后60秒内此IP将不能再访问,其他IP可以
[root@localhost ~]# nginx -s reload
再开一台机器使用ab测试:
[root@localhost ~]# ab -n 2000 -c 200 http://192.168.10.3/login.html
命令完成后访问:
[root@localhost ~]# curl http://192.168.10.3/login.html
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body bgcolor="white">
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx/1.10.3</center>
</body>
</html>
60秒后可再次访问:
[root@localhost ~]# curl http://192.168.10.3/login.html
<html>
<head>
<title> 测试Sql注入 </title>
<meta http-equiv="content-type"content="text/html;charset=utf-8">
</head>
<body>
<form action="sql.php" method="post">
<table>
…
完成。