PHP功能的熟悉
PHP文件可包含文本、HTML、JavaScript代码和PHP代码
获取用户输入
新建一个input.html和welcome.php
input.html内容如下:
<form action="welcome.php" method="post">
name:<input type="text" name="fname">
age:<input type="text" name="age">
<input type="submit">
</form>
welcome.php内容如下:
welcome,<?php echo $_POST["fname"];?>!<br>
your age is:<?php echo $_POST["age"];?>
将其放在网站根目录下,访问网站:
点击提交:
PHP编写安全的SQL查询功能
1.编写querry.php文件:
<?php
echo "<table style='border: solid 1px black;'>";
echo "<tr><th>Id</th><th>username</th><th>password</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "\n";
}
}
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "security";
try {
// 建立数据库连接
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置连接为异常模式
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 预处理模式
$stmt = $conn->prepare("SELECT * FROM users where id=:id");
// 给参数赋值
$stmt->bindParam(':id',$_REQUEST["id"]);
// 执行sql语句
$stmt->execute();
// 设置结果集为关联数组
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
// 将结果输出,并用表格封装
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
// 关闭数据库连接
$conn = null;
echo "</table>";
?>
2.编写index.html文件:
<html>
<head>
<meta charset="utf-8">
<title>实训测试</title>
</head>
<body>
<form action="querry.php" method="POST">
id: <input type="text" name="id">
<!-- 名字: <input type="text" name="fname">
年龄: <input type="text" name="age"> -->
<input type="submit" value="提交">
</form>
</body>
</html>
3.将两者放入网站根目录下,访问:
且其不能被联合查询注入:
SQLi代码审计
漏洞原因(代码层级)
1.审计点:mysql_connect()
2.未正确地进行预编译查询。
审计点:mysqli、pdo关键字
如直接拼接未进行绑定、未进行预编译、未正确初始化预编译选项导致宽字节注入
部署安全的文件上传demo脚本
漏洞原因(代码层级)
1.后端程序未正确识别和处理上传文件的扩展名、大小和内容
审计点:move_uploaded_file()
XSS代码审计
审计点:
$_GET
$_POST
$_REQUEST
$_COOKIE
前端提交的REFERER和USER-AGENT等记录的前端提交的内容
seay审计sqli-labs
启动seay,新建项目,打开sqli-labs第一关的文件夹,发现其未对输入的id进行处理,所以存在sql注入的漏洞。
小结
3种审计方式:
(1)代码通读审计
(2)危险函数审计
(3)关键功能及代码对照审计