这是我的计算机安全类的任务的一部分,所以我不是在寻找具体的答案,只是一些帮助.
我们得到了一个错误的程序(在php中)来控制一个sql数据库(一个银行帐户),我们必须找到一种方法来创建一个SQL注入攻击,让我们在不知道它的ID的情况下登录到一个帐户.
我很确定我知道漏洞在哪里,但我似乎无法让我的攻击工作.
有问题的代码(它有点长,但唯一重要的部分是第一部分):
<html><head><title>FrobozzCo Community Credit Union</title></head>
<body>
<h1>FrobozzCo Community Credit Union</h1>
<h4><i>We're working for GUE</i></h4>
<hr>
<?php
$debugmode = 1;
function debug($msg) {
global $debugmode;
if ($debugmode) {
echo "<h4>$msg</h4>\n";
}
}
$thispage = 'FCCU.php';
echo "<form action='$thispage' method='post' name='theform'>\n";
$dbuser = 'fccu';
$dbpass = 'fccubucks';
$dbhost = 'localhost';
$dbname = $dbuser;
$PARAM = array_merge($_GET, $_POST);
// get username and password from form
if (!$PARAM['id'] || !$PARAM['password']) {
login();
} else { // otherwise, attempt to authenticate
$id …Run Code Online (Sandbox Code Playgroud) 我认为这应该相对简单,但我无法弄清楚.我有一个代表坐标的字符串,+27.5916+086.5640我需要在经度和纬度之间放一个逗号,所以我得到了+27.5916,+086.5640.
我正在浏览API,但我似乎无法找到适合自己的东西.
哦,我必须使用Python 2.7.3,因为我编写的程序不支持Python 3.X.
我仍然有一些麻烦缠绕线程,我试图以最简单的方式做到这一点.我知道线程都必须有一个从Runnable类继承的run方法,但是它们也可以有其他方法,对吗?
原因是,我有一个带有一些私有变量和run方法的线程.它调用它的run函数,一旦完成,我想用完全相同的run方法重用该线程.它完全相同,只是使用不同的变量.所以我可以添加类似setArray方法的东西(该线程包含一个私有字节数组),所以我只需用这个新数组再次调用run,或者是不允许的.我想简单地说,它就像是
Thread thread = new MyThread();
thread.start();
// Check if the thread has finished in a non-blocking way
if (thread.isAlive() == false) {
thread.setArray(newArray)
thread.start();
}
Run Code Online (Sandbox Code Playgroud)
基本上我只有一个固定数量的线程,当第一个线程完成运行时,我想稍微改变参数并让它再次运行.我不想让他们死,这似乎是连接所做的.
对于特定问题,我说4个线程,每个线程给出一个较大字节数组的设置大小块.每个线程使用Deflater压缩该数组,并将其结果传递给处理同步的管理器对象.一旦完成第一个线程(如获得数组第一部分的线程,而不是第一个完成的线程),它就会移动到未分配给线程的下一个块.
我知道线程池是一个选项,但它似乎有点矫枉过正,我真的不理解它们(我仍然遇到普通线程的问题).
我认为有办法做到这一点,但我不确定如何?基本上,我正在编写一个压缩程序,当我尝试解压缩压缩数据时导致crc错误.通常这意味着解压缩器实际上将我的数据识别为正确格式并对其进行解压缩,但是当它将结果与CRC指示的预期长度进行比较时,它们并不相同.
但是,出于比较的原因,我实际上确实希望看到输出以查看它是否只是一个连接问题(如果解压缩的输出不是乱码但只是错误的顺序,这应该是相对明显的).
这是我的计算机安全课程的作业,所以我不需要具体的答案,但我想要一些建议,或者至少是总体方向,因为我已经绕了一段时间了。
基本上,我们有一个任务,给我们一个简单的 cgi 应用程序(用 perl 编写),该应用程序在某处存在漏洞,允许用户查看他们不应该查看的私有文件,例如 /etc/shadow。我们基本上必须证明我们可以攻击它并查看 /etc/shadow 文件。该应用程序是一个备忘录查看程序,允许用户编写和阅读备忘录。
现在,我对 Perl 还很陌生。很久以前,我确实在非常简单的网络内容中使用过它一两次,但这只是基础知识。
有问题的代码
#!/usr/bin/perl -w
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use strict;
my %labels; # global of pretty labels for memo pathnames
# glob through the homedirs for an array of paths to memos sorted by date
sub list_memo_selector {
my @memos = </home/*/memo/*>; # all regular users
push (@memos, </root/memo/*>); # special memos from root
foreach (@memos) {
$_ =~ m#^.+/([^/]+)$#; # regex extract filename
my $temp = …Run Code Online (Sandbox Code Playgroud) 我想我错过了很简单的事情.我有一个字节数组,使用Deflater保存写入其中的缩小数据:
deflate(outData, 0, BLOCK_SIZE, SYNC_FLUSH)
Run Code Online (Sandbox Code Playgroud)
我不仅使用GZIPOutputStream的原因是因为有4个线程(变量),每个线程都被赋予一个数据块,每个线程在将压缩数据存储到全局字节数组之前压缩它自己的块.如果我使用GZIPOutputStream它会混淆格式,因为每个小块都有一个标题和预告片,它是自己的gzip数据(我只想压缩它).
所以最后,我得到了这个byteArray,outData,它保存了我所有的压缩数据,但我不确定如何包装它.GZIPOutputStream从具有未压缩数据的缓冲区写入,但此数组全部已设置.它已经被压缩了,我只是试图弄清楚如何将它变成一个表格.
编辑:好的,我的措辞不好.我将它写入输出,而不是文件,以便在需要时可以重定向.一个非常简单的例子是
cat file.txt | java Jzip | gzip -d | cmp file.txt
Run Code Online (Sandbox Code Playgroud)
应该返回0.现在的问题是如果我按原样编写这个字节数组来输出,它只是"原始"压缩数据.我认为gzip需要所有这些额外的信息.
如果有另一种方法,那就没问题了.这样的全部原因是因为我需要使用多个线程.否则我只会调用GZIPOutputStream.
DOUBLE EDIT:由于评论提供了很多好的见解,另一种方法是我只有一堆未压缩的数据块,这些数据块原本是一个长流.如果gzip可以读取连接流,如果我接受了这些块(并按顺序保存它们)并将每个块分配给一个在自己的块上调用GZIPOutputStream的线程,然后取结果并连接它们.实质上,每个块现在都有标题,压缩信息和预告片.如果我连接它们,gzip会认识到吗?
例:
cat file.txt
Hello world! How are you? I'm ready to set fire to this assignment.
java Testcase < file.txt > file.txt.gz
Run Code Online (Sandbox Code Playgroud)
所以我从输入中接受它.在程序内部,流被分成"Hello world!"."你好吗?" "我准备放火烧这个任务"(它们不是字符串,它只是一个字节数组!这只是插图)
所以我有三个字节块,都是未压缩的.我将每个块都给了一个使用的线程
public static class DGZIPOutputStream extends GZIPOutputStream
{
public DGZIPOutputStream(OutputStream out, boolean flush) throws IOException
{
super(out, flush);
}
public void setDictionary(byte[] b)
{
def.setDictionary(b);
}
public void updateCRC(byte[] input)
{
crc.update(input); …Run Code Online (Sandbox Code Playgroud)